LOj #2002. 「SDOI2017」序列计数 (容斥+dp+矩阵快速幂)
来源:互联网 发布:柠檬tv网络电视 编辑:程序博客网 时间:2024/05/18 18:16
题目链接:
LOj 2002
题意:
要求得到一个长度为
题解:
根据容斥原理,因为题目要求至少有一个数是素数,用所有方案减去不含质数的方案就是答案。
设
如果不考虑包含质数的情况,因为
AC代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 20170408;const int sz = 110;int n,m,p;struct matrix{ int ma[sz][sz]; matrix friend operator *(const matrix a,const matrix b) { matrix ret; memset(ret.ma,0,sizeof(ret.ma)); for(int i=0;i<p;i++){ for(int j=0;j<p;j++) { for(int k=0;k<p;k++) { ret.ma[i][j] = (ret.ma[i][j] + 1LL * a.ma[i][k] * b.ma[k][j]%mod)%mod; } } } return ret; }}A,ans;matrix multipow(matrix x, int k){ memset(ans.ma,0,sizeof(ans.ma)); for(int i=0;i<p;i++){ ans.ma[i][i] = 1; } while(k) { if(k&1)ans=ans*x; k>>=1; x=x*x; } return ans;}bool isprime[20000010];int prime[2000010];void sieve(){ isprime[0] = true; isprime[1] = true; for(int i=2,cnt=0;i<=m;i++){ if(isprime[i]==false) prime[++cnt] = i; for(int j=1;j<=cnt&&i*prime[j]<=m;j++) { isprime[i*prime[j]] = true; if(i%prime[j]==0)break; } }}int dp[110];int solve1(){ for (int i=1;i<=m;i++) { dp[i%p]++; } for (int j=1;j<=m;j++) { A.ma[(-j%p+p)%p][0]++; } for (int i=1;i<p;i++) { for (int j=0;j<p;j++) { A.ma[j][i] = A.ma[(j-1+p)%p][i-1]; } }// for(int i=1;i<=m;i++)// { // for(int j=1;j<=m;j++){ // printf("%d ",A.ma[i][j]); // } // cout<<endl;// } A=multipow(A,n-1); int ans=0; for (int i=0;i<p;i++) { ans = (ans + 1LL * dp[i] * A.ma[i][0] % mod ) % mod; } //cout<<"ans1="<<ans<<endl; return ans;}int solve2(){ memset(dp,0,sizeof(dp)); for (int i=1;i<=m;i++) { if (isprime[i]) { dp[i%p]++; } } memset(A.ma,0,sizeof(A.ma)); for (int j=1;j<=m;j++) { if (isprime[j]) { A.ma[(-j%p+p)%p][0]++; } } for (int i=1;i<p;i++) { for (int j=0;j<p;j++) { A.ma[j][i] = A.ma[(j-1+p)%p][i-1]; } } //for(int i=1;i<=m;i++)// { // for(int j=1;j<=m;j++){ // printf("%d ",A.ma[i][j]); // } // cout<<endl;// } A=multipow(A,n-1); int ans=0; for (int i=0;i<p;i++) { ans = (ans + 1LL * dp[i] * A.ma[i][0] % mod ) % mod; } // cout<<"ans2="<<ans<<endl; return ans;}/*59 74 9212897479*/int main(){ //freopen("in.txt","r",stdin); scanf("%d%d%d",&n,&m,&p); sieve(); int x=solve1(); int y=solve2(); printf("%d\n",(x-y+mod)%mod); return 0; }
阅读全文
1 0
- LOj #2002. 「SDOI2017」序列计数 (容斥+dp+矩阵快速幂)
- [矩阵乘法] LOJ#2002. 「SDOI2017」序列计数
- bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)
- bzoj 4818 [Sdoi2017]序列计数(简单容斥+快速幂加速dp)
- [BZOJ4818][Sdoi2017][容斥原理][矩阵优化DP]序列计数
- 【动态规划20】bzoj4818[sdoi2017]序列计数(dp+矩阵快速幂)
- bzoj 4818 [Sdoi2017]序列计数 矩阵乘法优化dp+容斥
- [BZOJ4818][SDOI2017]序列计数(DP+容斥原理+矩乘)
- bzoj4818【SDOI2017】序列计数 矩阵快速幂+动态规划
- bzoj4818 [Sdoi2017]序列计数(矩阵)
- BZOJ 4818: [Sdoi2017]序列计数 (动态规划+矩阵乘法)
- [DP 倍增] BZOJ 4818 [Sdoi2017]序列计数
- loj #2001. 「SDOI2017」树点涂色(LCT)
- BZOJ4818 [Sdoi2017]序列计数
- 4818: [Sdoi2017]序列计数
- 【SDOI2017】序列计数
- BZOJ4818: [Sdoi2017]序列计数
- bzoj4818 [Sdoi2017]序列计数
- Opencv实现图像无缝拼接,Sift查找特征点,Flann进行匹配
- FreeMarker配置详解(新手必看)
- Java 类型信息 —— 获取泛型类型的类对象(.class)
- CentOS实用Shell命令简介
- Unity入门操作_旋转_006
- LOj #2002. 「SDOI2017」序列计数 (容斥+dp+矩阵快速幂)
- java集合类总结
- gcc 编译 so 导出函数问题
- mac上搭建appium+IOS自动化测试环境
- spring security(七) session 并发,一个用户在线后其他的设备登录此用户失败
- linux下编写调用so文件学习
- 徒手撸个http服务器(三)------epoll 实现
- angular中的http请求封装
- 【DP专辑】ACM动态规划总结