[BZOJ4818][SDOI2017]序列计数(动规+快速幂)
2018-04-05 11:00
357 查看
4818: [Sdoi2017]序列计数
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 972 Solved: 581
[Submit][Status][Discuss]Description
Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数。Alice还希望 ,这n个数中,至少有一个数是质数。Alice想知道,有多少个序列满足她的要求。Input
一行三个数,n,m,p。 1<=n<=10^9,1<=m<=2×10^7,1<=p<=100Output
一行一个数,满足Alice的要求的序列数量,答案对20170408取模。Sample Input
3 5 3Sample Output
33HINT
Source
[Submit][Status][Discuss]
水题,同[六省联考2017 组合数问题]。
首先套用上题做法,我想到的是f[i][j][0/1]表示前i个数总和%p=j的(不必须/必须有质数)的方案数,那么有转移状态:
f[i+j][(x+y)%p][0]+=f[i][x][0]*f[j][y][0]
f[i+j][(x+y)%p][1]+=f[i][x][1]*f[j][y][0]+f[i][x][0]*f[j][y][1]-f[i][x][1]*f[j][y][1]
这个可能是可以矩乘优化的但由于0和1互相转移所以比较麻烦。
那么我们考虑答案就是总方案数-不包含质数的方案数。
f[i][j]表示前i个数总和%p=j的方案数,g[i][j]表示前i个数(不包含质数)总和%p=j的方案数,这两个转移互不影响。
这样我们线性筛出m以内的质数,问题就完全变成上面那道题了。
$O(m+p^2\log n)$复杂度竟然能过?光一个线性筛搞不好就超了吧。。常数有点玄学啊,还是要敢写。
#include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=l; i<=r; i++) using namespace std; const int N=210,M=20000100,mod=20170408; bool b[M]; int n,m,p,tot,c ,f ,g ,F ,G ,pr[5000100]; void pre(){ for (int i=2; i<=m; i++){ if (!b[i]) pr[++tot]=i; for (int j=1; j<=tot && pr[j]*i<=m; j++){ int t=pr[j]*i; b[t]=1; if (i%pr[j]==0) break; } } } void mul(int a[],int b[]){ rep(i,0,p) c[i]=0; for (int i=0; i<p; i++) for (int j=0; j<p; j++) c[(i+j)%p]=(c[(i+j)%p]+1ll*a[i]*b[j])%mod; rep(i,0,p) a[i]=c[i]; } int main(){ freopen("count.in","r",stdin); freopen("count.out","w",stdout); scanf("%d%d%d",&n,&m,&p); pre(); F[0]=G[0]=1; b[1]=1; rep(i,1,m) f[i%p]=(f[i%p]+1)%mod,g[i%p]=(g[i%p]+b[i])%mod; for (; n; mul(f,f),mul(g,g),n>>=1) if (n & 1) mul(F,f),mul(G,g); printf("%d\n",(F[0]-G[0]+mod)%mod); return 0; }
相关文章推荐
- [DP 倍增] BZOJ 4818 [Sdoi2017]序列计数
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
- BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法
- BZOJ4818 [Sdoi2017]序列计数
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
- bzoj4818 [Sdoi2017]序列计数
- BZOJ4818 [Sdoi2017]序列计数
- BZOJ4818 [SDOI2017]序列计数 【生成函数 + 快速幂】
- bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)
- [BZOJ4818][SDOI2017]序列计数(DP+容斥原理+矩乘)
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
- bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】
- [bzoj4818][Sdoi2017]序列计数
- bzoj4818 [Sdoi2017]序列计数(矩阵)
- 【bzoj4818】[Sdoi2017]序列计数
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
- bzoj 4818: [Sdoi2017]序列计数
- bzoj 4818: [Sdoi2017]序列计数
- 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法
- bzoj 4818 [Sdoi2017]序列计数(简单容斥+快速幂加速dp)