[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想知道,有多少个序 ...
随机推荐
- 算法第四版学习笔记之优先队列--Priority Queues
软件:DrJava 参考书:算法(第四版) 章节:2.4优先队列(以下截图是算法配套视频所讲内容截图) 1:API 与初级实现 2:堆得定义 3:堆排序 4:事件驱动的仿真 优先队列最重要的操作就是删 ...
- .NET Core装饰模式和.NET Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- js中多维数组转一维
法一:使用数组map()方法,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组. var arr = [1,[2,[[3,4],5],6]]; function unid(arr){ v ...
- JAVA_SE基础——25.面向对象练习
黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...
- token 验证
组件: https://jwt.io/#libraries-io
- C# 使用 GDI+ 给图片添加文字,并使文字自适应矩形区域
需求 需求是要做一个编辑文字的页面.用户在网页端写文字,文字区域是个矩形框,用户可以通过下方的拖动条调节文字大小. 如下图: 提交数据的时候前端传文字区域的左上角和右下角定位给后台.因为前端的字体大小 ...
- IIS 配置 FTP 网站
在 服务器管理器 的 Web服务器IIS 上安装 FTP 服务 在 IIS管理器 添加FTP网站 配置防火墙规则 说明:服务器环境是Windows Server 2008 R2,IIS7.5. 1. ...
- Lock(三)查看是谁把表给锁了
查看是谁把表给锁了 select se1.inst_id as 被阻塞的会话节点, se2.inst_id as 罪魁祸首节点, se1.sid as 被阻塞的会话ID, ob.object_name ...
- 从PRISM开始学WPF(八)導航Navigation?
0x6Navigation Basic Navigation Prism中的Navigation提供了一种类似导航的功能,他可以根据用户的输入,来刷新UI. 先看一个最简单的例子,通过按钮来导航到一个 ...
- SSH 配置
ssh免密通用配置 Host * Port 1234 User root #ProxyCommand nc -X 5 -x 127.0.0.1:1081 %h %p #5 socks5, 4 sock ...