luogu 3702 [SDOI2017]序列计数 矩阵乘法+容斥
现在看来这道题真的不难啊~
正着求不好求,那就反着求:答案=总-全不是质数
这里有一个细节要特判:1不是质数,所以在算全不是质数的时候要特判1
code:
#include <bits/stdc++.h>
#define N 104
#define M 20000002
#define mod 20170408
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m,p,tot;
int cnt[N];
bool vis[M];
int prime[200000],cnt2[N];
struct matrix
{
ll a[100][100];
void re() { memset(a,0,sizeof(a));}
void I() { re(); for(int i=0;i<p;++i) a[i][i]=1ll; }
ll*operator[](int x) { return a[x]; }
}A,B;
matrix operator*(matrix a,matrix b)
{
matrix c;c.re();
int i,j,k;
for(i=0;i<p;++i)
{
for(j=0;j<p;++j)
for(k=0;k<p;++k)
c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mod+mod)%mod;
}
return c;
}
matrix operator^(matrix a,ll k)
{
matrix tmp;
for(tmp.I();k;k>>=1,a=a*a) if(k&1) tmp=tmp*a;
return tmp;
}
int main()
{
// setIO("input");
int i,j;
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=m;++i) cnt[i%p]++;
for(i=2;i<=m;++i)
{
if(!vis[i]) prime[++tot]=i;
for(j=1;j<=tot&&prime[j]*i<=m;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(i=1;i<=m;++i) if(vis[i]) ++cnt2[i%p];
++cnt2[1%p];
A.re();
B.re();
for(i=0;i<p;++i)
{
for(j=0;j<p;++j)
{
int pp=(j-i+p)%p;
A[i][j]=cnt[pp];
B[i][j]=cnt2[pp];
}
}
A=A^n;
B=B^n;
// printf("%lld %lld\n",A[0][0],B[0][0]);
printf("%lld\n",(A[0][0]-B[0][0]+mod)%mod);
return 0;
}
luogu 3702 [SDOI2017]序列计数 矩阵乘法+容斥的更多相关文章
- 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法
原文地址:http://www.cnblogs.com/GXZlegend/p/6825132.html 题目描述 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的 ...
- Luogu 3702 [SDOI2017]序列计数
BZOJ 4818 感觉不难. 首先转化一下题目,“至少有一个质数”$=$“全部方案”$ - $“一个质数也没有”. 注意到$m \leq 2e7$,$[1, m]$内的质数可以直接筛出来. 设$f_ ...
- BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法
发现转移矩阵是一个循环矩阵. 然后循环矩阵乘以循环矩阵还是循环矩阵. 据说还有FFT并且更优的做法. 之后再看吧 #include <map> #include <cmath> ...
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
- Luogu3702 SDOI2017 序列计数 矩阵DP
传送门 不考虑质数的条件,可以考虑到一个很明显的$DP:$设$f_{i,j}$表示选$i$个数,和$mod\ p=j$的方案数,显然是可以矩阵优化$DP$的. 而且转移矩阵是循环矩阵,所以可以只用第一 ...
- [Sdoi2017]序列计数 矩阵优化dp
题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
随机推荐
- WUSTOJ 1324: Base64 Coding(Java)未解决,求题解
题目链接:1324: Base64 Coding 资料:ASCII码表 原文是英文,而且篇幅较长.因此下面不粘贴原文,只写中文大意. Description Base64是一种编码算法.它的工作原理是 ...
- 【Linux】一步一步学Linux——Linux发展史(01)
目录 00. 目录 01. Linux概述 02. Linux简史 03. Linux主要特性 04. Linux之父 05. Linux相关术语 06. Linux其它 07. Linux应用领域 ...
- leetcode动态规划笔记三---单序列型
单序列型DP 相比一维DP,这种类型状态转移与过去每个阶段的状态都有关. Longest Increasing Subsequence : 求最大最小值 Perfect Squares : 求某个规模 ...
- ReflectionTest:由输入的类名得到类的信息
package reflection; import java.lang.reflect.*; import java.util.*; public class ReflectionTest { pu ...
- springboot中将日志信息存放在catalina.base中
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true& ...
- docker registry-v2 搭建私有仓库
参考官方文档:https://docs.docker.com/registry/deploying/ 参考 :http://www.tuicool.com/articles/6jEJZj 本例子使用两 ...
- Java QuickSelect
Java QuickSelect /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternationa ...
- CSS中@import url()
@import url( )总结: 1.import url( )机制是不同于link的,link是在加载页面前把CSS加载完毕,而@import url( )则是读取完文件后加载,所以会出现一开始没 ...
- iOS - 性能优化:Instruments使用简介
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
- U盘因格式化 NTFS 中断造成无法识别,生产平台同样无法识别的修复处理方案
特征: 电脑设备管理器(win10):识别到大容量存储设备 电脑磁盘管理:识别可移动磁盘无媒体 ChipGenius(v4_19_0319):能识别到制造商,但识别不到芯片具体型号 U盘相关生产平台: ...