[LOJ2002] [SDOI2017] 序列计数
题目链接
LOJ:https://loj.ac/problem/2002
洛谷:https://www.luogu.org/problemnew/show/P3702
Solution
考虑补集转换,用所有数减去只用合数的方案数,我们先考虑算所有数的
首先可以得到一个普及组\(\rm dp\),\(f_{i,j}\)表示当前填了前\(i\)个,总和\({\rm mod}\ p\)为\(j\)的方案数。
记录一个\(cnt_i\)表示\({\rm mod}\ p\)为\(i\)的数的个数。
转移就是\(f_{i,j}=\sum_{k=0}^{p-1}f_{i-1,(j-k){\rm mod}\ p}\cdot cnt_k\)。
然后我们拿矩阵大力优化这个转移就可以过了。
复杂度\(O(p^3\log n)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define ll long long
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxm = 2e7+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 20170408;
int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;}
int n,m,p;
struct Matrix {
int a[102][102];
Matrix () {memset(a,0,sizeof a);}
Matrix operator * (const Matrix &r) const {
Matrix c;
for(int i=0;i<p;i++)
for(int j=0;j<p;j++)
for(int k=0;k<p;k++)
c.a[i][j]=add(c.a[i][j],mul(a[i][k],r.a[k][j]));
return c;
}
};
Matrix qpow(Matrix a,int x) {
Matrix res;for(int i=0;i<p;i++) res.a[i][i]=1;
for(;x;x>>=1,a=a*a) if(x&1) res=res*a;
return res;
}
int pri[maxm],vis[maxm],tot,cnt1[102],cnt2[102];
void sieve() {
cnt1[1]=cnt2[1]=1;
for(int i=2;i<=m;i++) {
if(!vis[i]) pri[++tot]=i;
else cnt2[i%p]++;
cnt1[i%p]++;
for(int j=1;j<=tot&&i*pri[j]<=m;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
int solve(int *t) {
Matrix tp,res;
for(int i=0;i<p;i++)
for(int j=0;j<p;j++) tp.a[i][j]=t[(i-j+p)%p];
for(int i=0;i<p;i++) res.a[i][0]=t[i];
return (qpow(tp,n-1)*res).a[0][0];
}
int main() {
read(n),read(m),read(p);sieve();
write(del(solve(cnt1),solve(cnt2)));
return 0;
}
[LOJ2002] [SDOI2017] 序列计数的更多相关文章
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- P3702 [SDOI2017]序列计数
P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- [BZOJ4818][SDOI2017]序列计数(动规+快速幂)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 972 Solved: 581[Submit][Status ...
- [bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛
[Sdoi2017]序列计数 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=4818. 题解: 首先列出来一个递推式子 $f[i][0]$ ...
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
随机推荐
- shell脚本编程基础之case语句
基础简介 脚本编程分为: 面向过程 选择结构:if语句,单分支.双分支.多分支:case语句 控制结构:顺序结构(默认) 循环结构:for.while.until 面向对象 case语句结构 case ...
- hexo绑定个人域名
前段时间用 hexo 搭建的 gitpage 个人博客,服务器用的是 github 的,然后域名默认也是 github 下的二级域名:username.github.io, 现在为了提升格调准备将自己 ...
- SpringBoot聚合项目打包
1.打包遇到的问题: 子模块打包时,每次打包出来的jar都只有3k左右,没办法运行,目测应该是依赖的jar没有打包进来! 2.解决办法: 2.1.主项目的pom.xml里面不需要打包配置 2.2.在需 ...
- OpenFOAM——高空腔内的湍流自然对流
本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL052: Turbulent Natural Convection Inside ...
- ArgumentException: The Assembly Mono.WebBrowser is referenced by System.Windows.Forms ('Assets/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.
最近有个项目要用到System.Windows.Forms.dll,在Unity编辑器里用着还好好的,但是一导出就给我报错,让我十分不爽. 于是请教百度,搜出了五花八门的答案,没一个能解决我的问题的, ...
- server2003 IIS6.0 网站不可用
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到.本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息.您可能可以使用 /AUXSOURC ...
- 【转】使用fastboot命令刷机流程详解
一.Fastboot是什么? 1.1 首先介绍Recovery模式(卡刷) 在系统进行定制时,编译系统会编译出一份ZIP的压缩包,里面是一些系统分区镜像,提供给客户进行手动升级.恢复系统.需要提前将压 ...
- sqlite数据库使用具体案例以及mysqlite.db数据库
本文操作是测试数据库的其中一张表,其中包括清空sqlite数据库MyGroup表中的数据,清空sqlite数据库sqlite_sequence表中的自增变量,sqlite数据库MyGroup直接插入数 ...
- sysfile20191122
ass_s_ccp_ft:-108; ass_s_ccp_all:-108; ass_tag_ft:-105; ass_tag_all:-105; rept_port:9000; Q_value:0. ...
- win10找不到hosts文件(设置显示隐藏文件也找不到)解决方法
Win10系统中的Hosts文件有很多作用,屏蔽网址,指定解析,跳转等等,所以我们经常会通过编辑Hosts文件来达成一些目的,一般来说hosts文件是隐藏的,我们需要显示受保护的文件才可以,但是有一些 ...