[BZOJ4818][SDOI2017]序列计数(动规+快速幂)
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
水题,同[六省联考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=,M=,mod=;
bool b[M];
int n,m,p,tot,c[N],f[N],g[N],F[N],G[N],pr[]; void pre(){
for (int i=; i<=m; i++){
if (!b[i]) pr[++tot]=i;
for (int j=; j<=tot && pr[j]*i<=m; j++){
int t=pr[j]*i; b[t]=;
if (i%pr[j]==) break;
}
}
} void mul(int a[],int b[]){
rep(i,,p) c[i]=;
for (int i=; i<p; i++) for (int j=; j<p; j++) c[(i+j)%p]=(c[(i+j)%p]+1ll*a[i]*b[j])%mod;
rep(i,,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[]=G[]=; b[]=;
rep(i,,m) f[i%p]=(f[i%p]+)%mod,g[i%p]=(g[i%p]+b[i])%mod;
for (; n; mul(f,f),mul(g,g),n>>=)
if (n & ) mul(F,f),mul(G,g);
printf("%d\n",(F[]-G[]+mod)%mod);
return ;
}
[BZOJ4818][SDOI2017]序列计数(动规+快速幂)的更多相关文章
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...
- BZOJ4818 [SDOI2017]序列计数 【生成函数 + 快速幂】
题目 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数中,至少有一个数是质数.Alice想知道,有多少个序列满足她的要求. ...
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- [bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛
[Sdoi2017]序列计数 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=4818. 题解: 首先列出来一个递推式子 $f[i][0]$ ...
- bzoj4818 [Sdoi2017]序列计数
Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望,这n个数中,至少有一个数是质数.Alice想知道,有多少个序 ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- P3702 [SDOI2017]序列计数
P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...
随机推荐
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...
- 【LA】5135 Mining Your Own Business
[算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...
- Little Mathematics Knowledge 数学小常识
The sum of arithmetic sequence The sum of geometric sequence A special formula : n·n! = (n+1)! - n! ...
- css文本垂直水平居中
一.单行文本居中 .content{ height:100px; line-height:100px; text-align:center; border:1px solid red; } 效果图 二 ...
- 结合BeautyEye开源UI框架实现的较美观的Java桌面程序
BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序,主要功能就是图灵机器人和一个2345网站万年历的抓取.... 挺简单而且实用的一个项目,实现 ...
- /proc/diskstats文件注解
/proc/diskstats 注解 今儿在准备利用shell监控磁盘读写次数等信息时,看到该文件,但是又不清楚每段的具体含义,这里备注下. 文件内容 [root@namenode proc]# ca ...
- 宿主机mount虚拟机镜像文件
转载 mount挂载虚拟机镜像文件 使用mount挂载ubuntu虚拟机所在的img文件的时候,执行: “sudo mount -o loop xxx.img /mnt/xxx”, 系统提示: “mo ...
- 如何更新远程主机上的 Linux 内核
如何更新远程主机上的 Linux 内核 http://blog.csdn.net/robertsong2004/article/details/47277121 转载至:http://www.tiny ...
- NOIP 2012 Day1
tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这 ...
- linux命令(47):rmdir命令
1.命令格式: rmdir [选项]... 目录... 2.命令功能: 该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限. 3.命令参数: - p 递归删除目录dirn ...