codevs 5964 [SDOI2017]序列计数
[题解]
官方题解就两句话。
写了三个版本的不同分值代码。看代码吧。
前导1
//f[i][j][1/0]表示长为i,sum mod p=j,是否已经选了质数的方案数
#include<cstdio>
using namespace std;
const int mod=;
const int N=1e6+;
int tot,prime[N/];bool check[N];
int n,m,f[][N][];int p;
void pre(){
n=1e6;check[]=check[]=;
for(int i=;i<=n;i++){
if(!check[i]) prime[++tot]=i;
for(int j=;j<=tot&&i*prime[j]<=n;j++){
check[i*prime[j]]=;
if(!(i%prime[j])) break;
}
}
}
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
pre();
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=m;i++) f[][i%p][!check[i]]++;
for(int i=,val;i<n;i++){
for(int j=;j<p;j++){
for(int k=;k<=m;k++){
val=(j+k)%p;
if(!check[k]){
f[i+&][val][]=(f[i+&][val][]+f[i&][j][]+f[i&][j][])%mod;
}
else{
f[i+&][val][]=(f[i+&][val][]+f[i&][j][])%mod,
f[i+&][val][]=(f[i+&][val][]+f[i&][j][])%mod;
}
}
}
for(int j=;j<p;j++){
f[i&][j][]=;
f[i&][j][]=;
}
}
printf("%d",f[n&][][]);
return ;
}
前导2
#include<cstdio>
using namespace std;
const int mod=;
const int N=1e6+;
int tot,prime[N/];bool check[N];
int n,m,p;
int f[][N];
int g[][N];
int sz[N];
void pre(){
n=1e6;check[]=check[]=;
for(int i=;i<=n;i++){
if(!check[i]) prime[++tot]=i;
for(int j=;j<=tot&&i*prime[j]<=n;j++){
check[i*prime[j]]=;
if(!(i%prime[j])) break;
}
}
}
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
pre();
scanf("%d%d%d",&n,&m,&p);
//全集
for(int k=;k<=p;k++) sz[k]=m/p+(m%p>=k);sz[]=sz[p];
for(int i=;i<p;i++) f[][i]=sz[i];
for(int i=,val;i<n;i++){
for(int j=;j<p;j++){
for(int k=;k<p;k++){
val=(j+k)%p;
f[i+&][val]=(f[i+&][val]+sz[k]*f[i&][j])%mod;
}
}
for(int j=;j<p;j++) f[i&][j]=;
}
//不包含素数
for(int i=;i<=tot&&prime[i]<=m;i++) sz[prime[i]%p]--;
for(int i=;i<p;i++) g[][i]=sz[i];
for(int i=,val;i<n;i++){
for(int j=;j<p;j++){
for(int k=;k<p;k++){
val=(j+k)%p;
g[i+&][val]=(g[i+&][val]+sz[k]*g[i&][j])%mod;
}
}
for(int j=;j<p;j++) g[i&][j]=;
}
printf("%d",f[n&][]-g[n&][]);
return ;
}
AC代码
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=;
const int N=;
const int M=2e7+;
int tot,prime[M/];bool check[M];
int n,m,p;
int sz[N];
struct matrix{
ll s[N];//降低常数
matrix(){
memset(s,,sizeof s);
}
}A,B;
matrix operator *(const matrix &a,const matrix &b){
matrix c;
for(int i=;i<p;i++){
// c.s[i]=0;
for(int k=;k<p;k++){
c.s[i]+=a.s[(i-k+p)%p]*b.s[k];
c.s[i]%=mod;
}
}
return c;
}
ll fpow(matrix a,ll p){
matrix res;
// for(int i=0;i<p;i++) res.s[i]=0;
res.s[]=;
for(;p;p>>=,a=a*a) if(p&) res=res*a;
return res.s[];
}
void pre(){
check[]=check[]=;
for(int i=;i<=m;i++){
if(!check[i]) prime[++tot]=i;
for(int j=;j<=tot&&i*prime[j]<=m;j++){
check[i*prime[j]]=;
if(!(i%prime[j])) break;
}
}
}
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
pre();
for(int k=;k<=p;k++) sz[k]=m/p+(m%p>=k);sz[]=sz[p];
for(int i=;i<p;i++) A.s[i]=sz[i];
for(int i=;i<=tot&&prime[i]<=m;i++) sz[prime[i]%p]--;
for(int i=;i<p;i++) B.s[i]=sz[i];
ll ans=(fpow(A,n)-fpow(B,n))%mod;if(ans<) ans+=mod;
printf("%lld",ans);
return ;
}
codevs 5964 [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分怎么搞 想到暴力,本蒟 ...
随机推荐
- android Handler的使用(一)
Handler的使用(一) Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出 ...
- 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...
- Spring Cloud 模块简介
Spring Cloud Netflix对微服务的支持还有: Hystrix: 断路器和资源隔离 Feign: 声明式HTTP REST请求客户端 Ribbon: 与Eureka结合实现软负载均衡 Z ...
- intelliJ IDEA 配置MySQL数据库 详解
1> 在主界面中,点击右边侧栏的 Database ,在点击 + ,再Data Source 选择数据库 2> 填入 Database 数据库名,在输入 User 和 Password ...
- php 关于日期的一些计算
1.strtotime基本使用 date_default_timezone_set('PRC'); //设置中国时区 echo "今天:", date("Y-m-d&qu ...
- SQLSERVER中的timestamp 和 C#中的byte[] 转换
项目中由于需求设计,数据库中需要一个timestamp时间戳类型的字段来作为区别数据添加和修改的标识.由于timestamp在SQL SERVER 2005数据库中,不可为空的timestamp类型在 ...
- CentOS 7 下挂载NTFS文件系统并实行开机自动挂载
CentOS 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单. 首先要进入官网下载NTFS-3G工具 http://www. ...
- 响应式布局框架 Pure-CSS 5.0 示例中文版-中
8. 表单 Form 在 form 标签中添加 .pure-form 类,可生成单行表单(inline) 效果图: 代码: <form class="pure-form"&g ...
- hadoop修改
https://github.com/medcl/elasticsearch-analysis-ik/releases hadoop-/etc/hadoop/core-site.xml <con ...
- How to create PDF files in a Python/Django application using ReportLab
https://assist-software.net/blog/how-create-pdf-files-python-django-application-using-reportlab CONT ...