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

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

这里有一个细节要特判: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. xorm表结构操作实例

    获取数据库信息 package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "git ...

  2. Android--DES加密

    Base64.java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputS ...

  3. 小游戏UFO Fled

    UFO Fled:https://play.google.com/store/apps/details?id=cn.crane.game.flappyufo UFO Fled -- 点击屏幕帮助UFO ...

  4. ubuntu下tftp的安装、配置、使用

    1. 安装 sudo apt-get install tftp-hpa tftpd-hpa -y 2. 配置 sudo vi /etc/default/tftpd-hpa #/etc/default/ ...

  5. Hystrix 用法及注解用法

    一.hystrix参数使用方法 通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时间命令执行超时时间,为1000ms和执行是不启用超时 ...

  6. ActiveX控件的注册和反注册

    原文转自 https://blog.csdn.net/piaopiaopiaopiaopiao/article/details/41649495 ActiveX控件,需要注册之后才能使用. 注意:注册 ...

  7. OAuth 2.0 简介

    是什么: 授权框架/授权标准/授权协议(授权指的是授予你能做什么的权力) 干什么: 授权 使第三方应用程序或客户端获得对HTTP服务上用户帐户信息的有限访问权限(例如 Google,GitHub ) ...

  8. Asp.net Core 2.0 OpenId Connect Handler缺失Claims?

    原文:https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler ...

  9. 【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体

    在C#的List集合的操作中,有时候我们需要根据相关条件快速从List集合中获取到第一个符合条件的实体对象,例如有个全校班级的List集合,我们需要根据班级代码快速从List集合中查找出班级信息.可以 ...

  10. vue滚动分页加载以及监听事件处理

    <template> <div class="bodyContainer"> <div class="allContent" id ...