http://www.elijahqi.win/archives/3009
题意:给定n个环再给定k个人 求把k个人放到n个环上每个环至少一个人的方案数
直接暴力dp 65分 那么考虑正解
设A(x) 为当这个环大小为size时的生成函数 那么x^i前面的系数
A(x)=∑i=1size(sizei) A ( x ) = ∑ i = 1 s i z e ( s i z e i ) A(x)=\sum\limits_{i=1}^{size}\binom{size}{i}然后直接合并即可 但是暴力合并复杂度是不对的 注意到合并大小为sa,sb循环的时候复杂度是(sa+sb)log(n)那么这个和哈夫曼编码的过程其实相似我们使用哈夫曼编码的顺序合并每次将最小的两个size合并一下 然后因为多项式次数不会超过n所以复杂度是 n∗log(n)2 n ∗ l o g ( n ) 2 n*log(n)^{2}

#include<queue>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define pa pair<int,int>
using namespace std;
const int mod=998244353;
const int N=200000;
const int gg=3;
#define ll long long
inline char gc(){static char now[1<<16],*S,*T;if(T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}while(isdigit(ch)) x=x*10+ch-'0',ch=gc();return x*f;
}
inline int ksm(int b,int t){static ll tmp;tmp=1;for (;t;b=(ll)b*b%mod,t>>=1) if (t&1) tmp=tmp*b%mod;return tmp;
}
int R[N<<2],g[N],inv[N],fa[N],pend[N],k,m;bool flag[N];
inline int calc(int n,int m){return (ll)g[n]*inv[m]%mod*inv[n-m]%mod;
}
inline void ntt(vector<int> &x,int f,const int &n){for (int i=0;i<n;++i) if (i<R[i]) swap(x[i],x[R[i]]);for (int i=1;i<n;i<<=1){ll wn=ksm(gg,f==1?(mod-1)/(i<<1):mod-1-(mod-1)/(i<<1));for (int j=0;j<n;j+=i<<1){ll w=1;for (int k=0;k<i;++k,w*=wn,w%=mod){int t1=x[j+k],t2=w*x[i+j+k]%mod;x[j+k]=t1+t2>=mod?t1+t2-mod:t1+t2;x[i+j+k]=t1-t2<0?t1-t2+mod:t1-t2;}}}
}
vector<int> p[N];
inline void init(int n,int l){for (int i=0;i<n;++i) R[i]=(R[i>>1]>>1)|(i&1)<<l-1;
}
int n;
priority_queue<pa,vector<pa>,greater<pa> >q;
int main(){//freopen("a.in","r",stdin);int T=read();g[0]=1;for (int i=1;i<=180000;++i) g[i]=(ll)g[i-1]*i%mod;inv[180000]=ksm(g[180000],mod-2);for (int i=180000-1;~i;--i) inv[i]=(ll)inv[i+1]*(i+1)%mod;while(T--){static int top,nn;nn=n=read();k=read();memset(flag,0,sizeof(flag));for (int i=1;i<=n;++i) fa[i]=read();top=0;for (int i=1;i<=n;++i) {static int cnt,x;if (flag[i]) continue;cnt=0;x=i;while(!flag[x]) ++cnt,flag[x]=1,x=fa[x];pend[++top]=cnt;}for (int i=1;i<=top;++i) {static int size;size=pend[i];p[i].reserve(size+1);p[i].push_back(0);for (int j=1;j<=size;++j) p[i].push_back(calc(size,j));q.push(make_pair(size,i));}static int id1,id2;while(q.size()>=2){static int invv;id1=q.top().second;m=q.top().first;q.pop();id2=q.top().second;m+=q.top().first;q.pop();for (n=1;n<=m;n<<=1);init(n,log2(n));p[id1].resize(n<<1);p[id2].resize(n<<1);ntt(p[id1],1,n);ntt(p[id2],1,n);invv=ksm(n,mod-2);for (int i=0;i<n;++i) p[id1][i]=(ll)p[id1][i]*p[id2][i]%mod;ntt(p[id1],-1,n);p[id2].clear();for (int i=0;i<n;++i) p[id1][i]=(ll)invv*p[id1][i]%mod;while(p[id1][m+1])++m;p[id1].resize(m+1);q.push(make_pair(m,id1));}printf("%d\n",(ll)p[q.top().second][k]*ksm(calc(nn,k),mod-2)%mod);p[q.top().second].clear();q.pop();}return 0;
}

BJ 集训测试3 problemA信仰圣光相关推荐

  1. 2018暑假集训测试六总结

    拿到试题没几分钟,就有人说会做T1QAQ.第一题感觉似曾相识,其实不同.梳理出本质后发现有两个限制,便想用枚举+递推来快速求解,发现要么是不会推,要么是时空超限,不会优化.期间也想过通过离线做,去掉一 ...

  2. noip2019集训测试赛(五)

    Problem A: lcm Time Limit: 1000 ms Memory Limit: 256 MB Sample Input 3 1 2 5 Sample Output 1 4 55 HI ...

  3. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...

  4. 2016集训测试赛(二十六)Problem A: bar

    Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么 ...

  5. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  6. [补档]noip2019集训测试赛(九)

    因为这次考试我一道题都不会,所以先不写了 转载于:https://www.cnblogs.com/youddjxd/p/11442143.html

  7. [补档]noip2019集训测试赛(八)

    Problem B: 2048 Special Judge Time Limit: 1000 ms Memory Limit: 256 MB Description 2048曾经是一款风靡全球的小游戏 ...

  8. [补档]noip2019集训测试赛(十)

    Problem A: fibonacci Time Limit: 2000 ms Memory Limit: 256 MB Description 小y最近迷上了fibonacci数列,他定义了一种数 ...

  9. [补档]noip2019集训测试赛(十二)

    Problem A: 记忆(memory) Time Limit: 1000 ms Memory Limit: 512 MB Description 你在跟朋友玩一个记忆游戏. 朋友首先给你看了n个长 ...

最新文章

  1. java中并行_[JAVA] 12. Java中的并行Concurrency
  2. 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
  3. jquery学习手记(5)对象
  4. 考勤系统的业务概念图
  5. 随笔   面试题网站
  6. 工作392-选择Hbuilder x导入项目
  7. 目前发展医疗物联网的困境解析
  8. 雪城大学信息安全讲义 4.3~4.4
  9. (转)问题: Oracle Database 10g 未在当前操作系统中经过认证
  10. 如何使用AdminStudio软件把.exe转换成.msi
  11. atitit.为什么java体系开发效率这样低的原因and解决
  12. java 前端及后台轮询方法总结
  13. python调用win32api详解_Python调用Win32 API实现截图
  14. CentOS之——CentOS 6.5 安装RTL8111/8168B PCI EXPRESS网卡并解决安装出现的问题
  15. Unhandled exception in script的解决方法
  16. android app 马甲包,关于Android多渠道打包和马甲包问题
  17. 前端:打开你的摄像头
  18. 大数据与机器学习-大数据预测
  19. 屏蔽浏览器 回退按钮的方法
  20. Java套版生成动态图片

热门文章

  1. 【SAP业务模式】之ICS(一):业务详述
  2. java的log4j 配置详解
  3. 什么是类别、离散和连续变量?
  4. java web项目的创建
  5. 密室逃脱,真的是一门“隐秘”的赚钱方式?
  6. Linxu下打开chm文件的方法
  7. 基金评价专题4:H_M(双贝塔)模型
  8. 重点计算机大学,计算机专业168强高校排名:这些大学实力很强,可重点关注!...
  9. JsonCpp 使用指导
  10. VR溺水自救体验项目普及了哪些知识|广州华锐互动