现在看来这道题真的不难啊~

正着求不好求,那就反着求:答案=总-全不是质数

这里有一个细节要特判: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]序列计数 矩阵乘法+容斥的更多相关文章

  1. 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825132.html 题目描述 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的 ...

  2. Luogu 3702 [SDOI2017]序列计数

    BZOJ 4818 感觉不难. 首先转化一下题目,“至少有一个质数”$=$“全部方案”$ - $“一个质数也没有”. 注意到$m \leq 2e7$,$[1, m]$内的质数可以直接筛出来. 设$f_ ...

  3. BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法

    发现转移矩阵是一个循环矩阵. 然后循环矩阵乘以循环矩阵还是循环矩阵. 据说还有FFT并且更优的做法. 之后再看吧 #include <map> #include <cmath> ...

  4. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

  5. [Sdoi2017]序列计数 [矩阵快速幂]

    [Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...

  6. 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]

    序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...

  7. Luogu3702 SDOI2017 序列计数 矩阵DP

    传送门 不考虑质数的条件,可以考虑到一个很明显的$DP:$设$f_{i,j}$表示选$i$个数,和$mod\ p=j$的方案数,显然是可以矩阵优化$DP$的. 而且转移矩阵是循环矩阵,所以可以只用第一 ...

  8. [Sdoi2017]序列计数 矩阵优化dp

    题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...

  9. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 359 Description Al ...

随机推荐

  1. WUSTOJ 1319: 球(Java)并查集

    题目链接:1319: 球 参考:wustoj 1319 球-wust_tanyao,并查集 并查集系列:WUSTOJ 1346: DARK SOULS(Java)并查集 Description Icy ...

  2. 机器学习之softmax回归笔记

    本次笔记绝大部分转自https://www.cnblogs.com/Luv-GEM/p/10674719.html softmax回归 Logistic回归是用来解决二类分类问题的,如果要解决的问题是 ...

  3. 【springcloud】2.eureka源码分析之令牌桶-限流算法

    国际惯例原理图 代码实现 package Thread; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomi ...

  4. S04_CH02_工程移植ubuntu并一键制作启动盘

    S04_CH02_工程移植ubuntu并一键制作启动盘 2.1概述 2.2搭建硬件系统 本章硬件工程还是使用<S04_CH01_搭建工程移植LINUX/测试EMMC/VGA>所搭建的VIV ...

  5. layer.open自定义弹出位置

    fixed:false,设置top才有效,待测试. 这个设置不起作用 var img = "<img src=\"/_temp/qrcodenet/m/book/book20 ...

  6. 怎样修改vim的缩进

    默认vim的tab缩进是八个空格, 太长了, 需要改短一点. 第一步: 找到vimrc文件所在位置 # find / -name vimrc 第二步: 找到以后用vim打开vimrc文件并增加下面两行 ...

  7. javascript 之 Object.defineProperty

    语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...

  8. java保证多线程的执行顺序

    1. java多线程环境中,如何保证多个线程按指定的顺序执行呢? 1.1 通过thread的join方法保证多线程的顺序执行, wait是让主线程等待 比如一个main方法里面先后运行thread1, ...

  9. Device doesn't support wireless sync. AMDeviceStartService

    Flutter1.9.1+hotfix2 Dart2.5 在iOS13真机上启动不了 错误信息 Device doesn't support wireless sync. AMDeviceStartS ...

  10. 软件自带依赖库还是共享对象库/为什么linux发行版之间不能有一个统一的二进制软件包标准

    接前文:Linux软件包(源码包和二进制包)及其区别和特点 在前文,我们知道了linux软件包分为源码包和二进制包两种方式,而不同的发行版之间又有着自己的二进制打包格式. 首先,软件运行依赖着各种各样 ...