解题报告:HDU_6061 RXD and functions NTT
来源:互联网 发布:国信蓝点java培训 编辑:程序博客网 时间:2024/06/07 04:07
题目链接
题意及官方题解:
思路:
先感谢Q巨指点Qrz...
先求得系数式:
拆开组合数:
把系数提取出来稍作变换:
整理一下:
得到:
然后就可以直接进行NTT了。。
代码;
#include<bits/stdc++.h>const int mod = 998244353;const int N = 4e5+10;const int g = 3;using namespace std;long long F1[N],F2[N],qp[30];int getLen(int a){ a<<=1; int res = 1; while(res<a)res<<=1; return res;}long long qpow(long long x,long long y){ long long res = 1; while(y){ if(y&1){ res = res * x % mod; }x = x * x % mod; y >>= 1; }return res;}void brc(long long *a,int l){ for(int i=1,j=l/2;i<l-1;i++){ if(i<j)swap(a[i],a[j]); int k=l/2; while(j>=k){ j-=k; k>>=1; } if(j<k)j+=k; }}void ntt(long long *y,int l,int on){ brc(y,l); int id = 0; long long u,t,tmp; for(int h=2;h<=l;h<<=1){ id++; for(int j=0;j<l;j+=h){ long long w = 1; for(int k=j;k<j+h/2;k++){ u = y[k]; t = w*y[k+h/2]%mod; y[k] = u+t; if(y[k]>=mod)y[k]-=mod; y[tmp=k+h/2]=u-t; if(y[tmp]<0)y[tmp]+=mod; w = w*qp[id]%mod; } } }if(on<0){ for(int i=1;i<l/2;i++)swap(y[i],y[l-i]); long long ni = qpow(l,mod-2); for(int i=0;i<l;i++)y[i] = (y[i]*ni)%mod; }}int K[N];long long fro[N];long long ni[N];void init(){ for(int i=0;i<21;i++){ int t=1<<i; qp[i]=qpow(g,(mod-1)/t); } fro[0] = ni[0] = 1; for(int i=1;i<N;i++){ fro[i] = fro[i-1] * i % mod; }ni[N-1] = qpow(fro[N-1],mod-2); for(int i=N-1;i;i--){ ni[i-1] = ni[i] * i % mod; }}long long ans[N];int main(){ init(); int n,m; //freopen("1006.in","r",stdin); //freopen("my_1006.out","w",stdout); while(scanf("%d",&n)==1){ long long a = 0; for(int i=0;i<=n;i++)scanf("%d",&K[i]); scanf("%d",&m); for(int i=0,x;i<m;i++){ scanf("%d",&x); a -= x; if(a<0)a+=mod; }int l = getLen(n+1); if(a==0){ for(int i=0;i<=n;i++){ printf("%d ",K[i]); }printf("\n"); continue; } for(int i=0,aa=1;i<l;i++){ if(i<=n){ F1[i] = aa * ni[i] % mod; F2[i] = fro[n-i] * K[n-i] % mod; }else { F1[i] = F2[i] = 0; }aa = 1LL * aa * a % mod; }ntt(F1,l,1);ntt(F2,l,1); for(int i=0;i<l;i++){ F1[i] = F1[i] * F2[i] % mod; }ntt(F1,l,-1); for(int i=0;i<=n;i++){ ans[i] = F1[i] ; ans[i] = ( ans[i] % mod + mod ) * ni[n-i] % mod; }for(int i=0;i<=n;i++){ printf("%I64d ",ans[n-i]); }printf("\n"); }return 0;}
阅读全文
1 0
- 解题报告:HDU_6061 RXD and functions NTT
- HDU6061 RXD and functions[NTT]
- HDU 6061 RXD and functions(NTT)
- [HDU] 6061 RXD and functions [NTT]
- HDU 6061 RXD and functions(NTT+卷积)
- HDU6061 RXD and functions
- HDU 6061 RXD and functions
- hdu 6061 RXD and functions [快速数论变换]
- 1080 Human Gene Functions 解题报告
- 2017 多小训练第三场 HDU 6061 RXD and functions
- Prince and Process 解题报告
- codeforces815cKaren And Market解题报告
- HDU6060-RXD and dividing
- RXD and math HDU
- RXD and math
- HDU6063-RXD and math
- hdu6063-RXD and math
- HDU6060 RXD and dividing
- (转)POJ 2049 走迷宫选取经过门最少的路线 BFS搜索
- Mac下跑仅CPU模式下的py-faster-rcnn
- Bug记录、归纳
- 【人生苦短,我用Python】Python免费精品课连载(2)——序列、列表、元组与字符串
- sql语句优化之索引
- 解题报告:HDU_6061 RXD and functions NTT
- Dungeon Master (广搜)
- WebService+Rxjava
- ios-CALayer
- 深度学习:卷积神经网络CNN
- IDEA tomcat问题
- C++词法记号规则之标识符 关键字 操作符 分隔符 空白符
- Math.random()
- Ubiquitous Religions 【poj-2524】【并查集】