cogs 2259. 异化多肽 (生成函数+NTT)
2017-04-18 07:32
267 查看
题目描述
传送门
题目大意:M种氨基酸,已知其相对分子质量分别为C1,C2,C3……,经过精密的脱水缩合后形成了大量各种各样的肽链。需要预测有多少种多肽链水解后相对分子质量和为N。(A-B-C与C-B-A两条肽链视为不同)题解
设生成函数A(x),序列中的每一位{ai}表示相对分子质量为i的氨基酸有多少个。生成函数B(x),序列中的每一位{bi}表示相对分子质量和为i的肽链有多少种。
那么容易得出B(x)=∑i=0∞A(x)i
根据无穷等比数列的计算公式B(x)=11−A(x)
那么我们只要对多项式1−A(x)求逆,得到的多项式B(x)中xn的系数就是答案。
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define N 600003 #define p 1005060097 #define LL long long using namespace std; LL a ,b ,c ; int n,m,n1,L,R ; LL quickpow(LL num,LL x) { LL base=num%p; LL ans=1; while(x){ if (x&1) ans=ans*base%p; x>>=1; base=base*base%p; } return ans; } void NTT(LL a ,int n,int opt) { for (int i=0,j=0;i<n;i++) { if (i>j) swap(a[i],a[j]); for (int l=n>>1;(j^=l)<l;l>>=1); } for (int i=1;i<n;i<<=1) { LL wn=quickpow(5,(p-1)/(i<<1)); for (int p1=i<<1,j=0;j<n;j+=p1){ LL w=1; for (int k=0;k<i;k++,w=w*wn%p){ LL x=a[j+k]; LL y=a[j+k+i]*w%p; a[j+k]=(x+y)%p; a[j+k+i]=(x-y+p)%p; } } } if (opt==-1) reverse(a+1,a+n); } void INV(int n,LL a ,LL b ,LL c ) { if (n==1) b[0]=quickpow(a[0],p-2); else { INV(n>>1,a,b,c); int k=(n<<1); for (int i=0;i<n;i++) c[i]=a[i]; for (int i=n;i<k;i++) c[i]=0; NTT(c,k,1); NTT(b,k,1); for (int i=0;i<k;i++) b[i]=(2-c[i]*b[i]%p+p)%p*b[i]%p; NTT(b,k,-1); LL inv=quickpow(k,p-2); for (int i=0;i<k;i++) b[i]=b[i]*inv%p; for (int i=n;i<k;i++) b[i]=0; } } int main() { freopen("polypeptide.in","r",stdin); freopen("polypeptide.out","w",stdout); scanf("%d%d",&n,&m); int mx=0; for (int i=1;i<=m;i++) { int x; scanf("%d",&x); a[x]--; mx=max(mx,x); } a[0]=1; int t=n; for (int i=0;i<=mx;i++) a[i]=(a[i]+p)%p; m=2*mx; for (n1=1;n1<=m;n1<<=1) L++; for (int i=0;i<=n1;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1)); INV(n1,a,b,c); printf("%I64d\n",b[t]%p); }
相关文章推荐
- [BZOJ2259]异化多肽(生成函数+NTT+多项式求逆)
- cogs2259 异化多肽 [多项式求逆]
- NesCafe41 异化多肽 NTT实现多项式求逆
- 【 bzoj 3992 】 [SDOI2015]序列统计 - NTT 生成函数
- 【BZOJ】3992: [SDOI2015]序列统计 NTT+生成函数
- BZOJ 3992 SDOI 2015 序列统计 NTT 生成函数 计数 原根
- [BZOJ3771]Triple-NTT-生成函数-容斥原理
- COGS2259 异化多肽
- [生成函数][NTT][多项式求逆]BZOJ 3456: 城市规划
- Nescafé 41-异化多肽polypeptide
- BZOJ 3456 城市规划 NTT 生成函数计数 ***
- HDU 6067 Big Integer(生成函数+NTT)
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
- [COGS2189][HZOI 2015]帕秋莉的超级多项式-NTT-多项式求逆-多项式求ln-多项式开方-多项式求exp-多项式快速幂
- BZOJ[3992][SDOI2015]序列统计 生成函数+NTT
- Nescafe41 ProblemA 异化多肽 多项式求逆
- [任意模数NTT 三模数NTT] COGS 2294 [HZOI 2015] 释迦
- cogs 2287. [HZOI 2015]疯狂的机器人 (NTT优化DP)
- [Nescafé41]异化多肽(多项式求逆元)
- NTT大规模网络故障