博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nssl1257-A【数论】
阅读量:2023 次
发布时间:2019-04-28

本文共 1078 字,大约阅读时间需要 3 分钟。

正题


题目大意

对于n个数组成的序列,求排好序需要最少交换次数的期望次数。


解题思路

我们可以先求出需要次数总和在乘上 n ! n! n!的逆元

先打一个表,不难发现
f ( n ) = f ( n − 1 ) ∗ n + ( n − 1 ) ( n − 1 ) ! f(n)=f(n-1)*n+(n-1)(n-1)! f(n)=f(n1)n+(n1)(n1)!
然后我们在考虑插入,对于前面一个序列,我们可以插入一个比前面的数都大的数进去,之后我们会发现只有插在最后面才不会增加交换次数,其他都会增加一次交换次数,式子显然正确。

之后 f f f离线预处理,逆元在线处理

时间复杂度: O ( N + T    l o g   p ) O(N+T\ \ log\ p) O(N+T  log p)


code

#include
#include
#define p 998244353#define N 10000000#define ll long longusing namespace std;ll t,f[N+10],k,n,jx[N+10];ll read() {
int x=0,f=1; char c=getchar(); while(!isdigit(c)) {
if(c=='-')f=-f;c=getchar();} while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar(); return x*f;}void write(ll x){
if (x>9) write(x/10); putchar(x%10+48); return;}ll power(ll x,ll b)//费马小求逆元{
ll ans=1; while(b) {
if(b&1) ans=ans*x%p; x=x*x%p; b>>=1; } return ans;}int main(){
scanf("%lld",&t); f[2]=1;jx[2]=2; for(ll i=3;i<=N;i++)//预处理 {
jx[i]=jx[i-1]*i%p;//阶乘预处理 f[i]=(f[i-1]*i%p+(jx[i]-jx[i-1]+p)%p)%p; } for(ll i=1;i<=t;i++) {
n=read(); write(power(jx[n],p-2)*f[n]%p); putchar('\n'); }}

转载地址:http://xxzaf.baihongyu.com/

你可能感兴趣的文章
直播预告:AAAI 2021专场五| AI TIME PhD
查看>>
同一种方法,同一句话,翻译成英语和泰语,差别为什么这么大?
查看>>
利用网络信息减少因果推断中的confounding bias--结合两种思路的新方法
查看>>
对话模型,DialogBERT和DialogWAE优势何在?
查看>>
直播 | AAAI 2021最佳论文第一作者为大家解读Informer
查看>>
直播预告 | 神经模型架构何以高效?PhD大佬为你揭开迷纱
查看>>
AI TIME PhD实验室专场,四月隆重登场!
查看>>
直播预告 | 浙大CAD&CG实验室专场一
查看>>
大规模多智能体路径规划
查看>>
直播预告 | 浙大CAD&CG实验室专场二
查看>>
直播预告 | 哈工大HIT-SCIR实验室专场二
查看>>
2021 年人工智能全球最具影响力学者榜单 AI 2000 发布
查看>>
针对CNN预训练模型的ICE解释框架
查看>>
数字经济时代,什么是关键资源?(算力篇)
查看>>
如何迈向高效深度神经网络模型架构?
查看>>
直播预告 | 北航ACT实验室专场一
查看>>
增量关系抽取中的灾难性遗忘与顺序敏感性
查看>>
基于分解对抗学习的公平新闻推荐
查看>>
线下活动 | AI TIME 走进深圳大学城
查看>>
直播预告 | 如何迈向知识驱动的人工智能?
查看>>