[SDOI2017]序列计数
题目描述
Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数。
Alice还希望,这nn个数中,至少有一个数是质数。
Alice想知道,有多少个序列满足她的要求。
输入输出格式
输入格式:
一行三个数,n,m,pn,m,p。
输出格式:
一行一个数,满足Alice的要求的序列数量,答案对2017040820170408取模。
输入输出样例
说明
对20\%20%的数据,1\leq n,m\leq1001≤n,m≤100
对50\%50%的数据,1\leq m \leq 1001≤m≤100
对80\%80%的数据,1\leq m\leq 10^61≤m≤106
对100\%100%的数据,1\leq n \leq 10^9,1\leq m \leq 2\times 10^7,1\leq p\leq 1001≤n≤109,1≤m≤2×107,1≤p≤100
时间限制:3s
空间限制:128MB
至少有一个素数的方案=所有方案-没有素数的方案
于是用容斥就变成了简单的dp,先讨论所有方案
令f[i][j]表示i个数,和%p为j的方案数
f[i][j]=∑f[i-1][(j-k+p)%p]*cnt[k]
cnt[k]是1~m中%p等于k的数量
发现显然上式可以写为矩阵
于是用矩阵快速幂就行
然后用欧拉筛把素数筛掉,再做一次
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Matrix
{
lol a[][];
}pre,ans1,ans2,Mat1,Mat2;
lol n,m,p,Mod=;
long long cnt1[],cnt2[];
lol tot,pri[];
bool vis[];
Matrix operator*(const Matrix a,const Matrix b)
{
lol i,j,k;
Matrix res;
memset(res.a,,sizeof(res.a));
for (k=;k<p;k++)
for (i=;i<p;i++)
if (a.a[i][k])
{
for (j=;j<p;j++)
{
res.a[i][j]+=a.a[i][k]*b.a[k][j];
res.a[i][j]%=Mod;
}
}
return res;
}
Matrix qpow1(lol y)
{lol i;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=;i<p;i++)
res.a[i][i]=;
while (y)
{
if (y&) res=res*Mat1;
Mat1=Mat1*Mat1;
y=y/;
}
return res;
}
Matrix qpow2(lol y)
{lol i;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=;i<p;i++)
res.a[i][i]=;
while (y)
{
if (y&) res=res*Mat2;
Mat2=Mat2*Mat2;
y=y/;
}
return res;
}
int main()
{lol i,j;
cin>>n>>m>>p;
cnt1[]++;
for (i=;i<=m;i++)
{
cnt1[i%p]++,cnt1[i%p]%=Mod;
if (vis[i]==)
{
++tot;
pri[tot]=i;
}
for (j=;j<=tot;j++)
{
if (i*pri[j]>m) break;
vis[i*pri[j]]=;
if (i%pri[j]==) break;
}
}
cnt2[]++;
for(i=;i<=m;i++)
if (vis[i]) cnt2[i%p]++,cnt2[i%p]%=Mod;
for (i=;i<p;i++)
{
for (j=;j<p;j++)
{
Mat1.a[i][(i+j)%p]+=cnt1[j]%Mod;
Mat1.a[i][(i+j)%p]%=Mod;
}
}
for (i=;i<p;i++)
pre.a[][i]=cnt1[i];
ans1=qpow1(n-);
ans1=pre*ans1;
for (i=;i<p;i++)
{
for (j=;j<p;j++)
{
Mat2.a[i][(i+j)%p]+=cnt2[j]%Mod;
Mat2.a[i][(i+j)%p]%=Mod;
}
}
for (i=;i<p;i++)
pre.a[][i]=cnt2[i];
ans2=qpow2(n-);
ans2=pre*ans2;
cout<<(ans1.a[][]-ans2.a[][]+Mod)%Mod;
}
[SDOI2017]序列计数的更多相关文章
- [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 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- [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分怎么搞 想到暴力,本蒟 ...
- bzoj4818 [Sdoi2017]序列计数
Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望,这n个数中,至少有一个数是质数.Alice想知道,有多少个序 ...
随机推荐
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- 项目Alpha冲刺Day1
一.会议照片 二.项目进展 1.今日安排 讨论完成项目的详细设计,并完成数据库的设计,学习powerDesigner的使用 2.问题困难 powerDesigner导出sql语句因为问题无法导入,特别 ...
- android 广播安装指定下载的apk
// 广播出去,由广播接收器来处理下载完成的文件 Intent sendIntent = new Intent("com.test.downloadComplete"); ...
- Markdown文本测试
一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 1. 这是一 2. 这是二 这是无序符号 My Github 这是着重表示 这是斜体 一级粗体 二级斜体 cin >> a; c ...
- GPUImage滤镜效果翻译
#import"GPUImageBrightnessFilter.h"//亮度 #import"GPUImageExposureFilter.h"//曝光 #i ...
- IE浏览器支持响应式网站设计
目前响应式网站设计比较流行, 下面是摘自百度百科有关响应式设计的定义. 响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的 ...
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- dede观看总结自己总结
知识点一:{dede:arclist channelid="18" addfields="language,pfz" limit="0,5" ...
- WPF 自定义滚动条(ScrollView、ScrollBar)样式
一.滚动条基本样式 本次修改Scrollview及ScrollBar滚动条样式是通过纯样式实现的.修改的内容包含滚动条的颜色,上下按钮的隐藏.另外添加了鼠标经过滚动条动画. style样式如下: &l ...
- SpringCloud的服务注册中心(二)注册中心服务端和两个微服务应用客户端
一.构建EurekaServer工程 1.pom.xml 2.application.yml 3. EurekaServerApp.java 4.启动EurekaServer 二.构建部署 Eurek ...