【BZOJ4818】[Sdoi2017]序列计数

Description

Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数。Alice还希望
,这n个数中,至少有一个数是质数。Alice想知道,有多少个序列满足她的要求。

Input

一行三个数,n,m,p。
1<=n<=10^9,1<=m<=2×10^7,1<=p<=100

Output

一行一个数,满足Alice的要求的序列数量,答案对20170408取模。

Sample Input

3 5 3

Sample Output

33

题解:至少包含1个质数的数量=总数-不包含质数的数量 (这种补集法不是一次两次见到了吧?)

于是我们考虑用DP求解,先快筛出1..m内的质数,1..m内除以P模为j的数的个数,1..m内除以P模为j的合数的个数

然后设f[i][j]表示i个数,总和除以P模j的方案数,g[i][j]表示i个合数,总和除以P模j的方案数,容易得出

f[i+1][(j+k)%P]+=f[i][j]+1..m内除以P模为j的数的个数
g[i+1][(j+k)%P]+=g[i][j]+1..m内除以P模为j的合数的个数

发现时间复杂度O(np),用矩乘快速幂优化一下就好啦

#include <cstdio>
#include <cstring>
#include <iostream>
#define mod 20170408
using namespace std;
typedef long long ll;
int np[20000010],cnt[110],sum[110],pri[10000010];
int n,m,p,tot;
typedef struct matrix
{
ll v[110][110];
}M;
M x,ans,emp;
ll ans1;
M mmul(M a,M b)
{
M c=emp;
int i,j,k;
for(i=0;i<p;i++)
for(j=0;j<p;j++)
for(k=0;k<p;k++)
c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%mod;
return c;
}
void pm(int y)
{
while(y)
{
if(y&1) ans=mmul(ans,x);
x=mmul(x,x),y>>=1;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
int i,j;
np[1]=cnt[1]=sum[1]=1;
for(i=2;i<=m;i++)
{
sum[i%p]=(sum[i%p]+1)%mod;
if(!np[i]) pri[++tot]=i;
else cnt[i%p]=(cnt[i%p]+1)%mod;
for(j=1;j<=tot&&i*pri[j]<=m;j++)
{
np[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
for(i=0;i<p;i++)
for(j=0;j<p;j++)
x.v[i][(i+j)%p]=(x.v[i][(i+j)%p]+sum[j])%mod;
ans.v[0][0]=1;
pm(n);
ans1=ans.v[0][0];
memset(ans.v,0,sizeof(ans.v)),memset(x.v,0,sizeof(x.v));
ans.v[0][0]=1;
for(i=0;i<p;i++)
for(j=0;j<p;j++)
x.v[i][(i+j)%p]=(x.v[i][(i+j)%p]+cnt[j])%mod;
pm(n);
printf("%lld",(ans1-ans.v[0][0]+mod)%mod);
return 0;
}

【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法的更多相关文章

  1. [bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛

    [Sdoi2017]序列计数 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=4818. 题解: 首先列出来一个递推式子 $f[i][0]$ ...

  2. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

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

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

  4. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  5. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  6. BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】

    题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...

  7. BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*

    BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...

  8. [BZOJ4818][SDOI2017]序列计数(动规+快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 972  Solved: 581[Submit][Status ...

  9. [Bzoj4818]序列计数(矩阵乘法+DP)

    Description 题目链接 Solution 容斥原理,答案为忽略质数限制的方案数减去不含质数的方案数 然后矩阵乘法优化一下DP即可 Code #include <cstdio> # ...

随机推荐

  1. dbcp数据库连接池管理

    该包主要是管理数据库的链接,获取链接.释放连接.设置最大连接数.初始化连接数.回收的空闲时间 在连接数据库时创建一个连接池可以很方便的管理所有数据库链接,和高效的使用数据库连接. 主要的两个对象是Ba ...

  2. 百度地图 驾车/公交查询Demo(支持多起点多终点)

    效果图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  3. Android - 资源(resource)转换为String

    资源(resource)转换为String 本文地址: http://blog.csdn.net/caroline_wendy Android建议资源的动态绑定, 即把string写入资源内, 然后运 ...

  4. java工程资源文件夹嵌套建立!

    做过一遍忘了,找了半天!记这里,看你还忘不忘!

  5. CCFollow和ActionCallFunc

    CCFollow动作,可以让一个节点跟随另一个节点做位移. CCFollow经常用来设置layer跟随sprite,可以实现类似摄像机跟拍的效果 效果是精灵在地图上移动,地图也会跟着移动,但是精灵仍然 ...

  6. Spring Cloud心跳监测

    Spring Cloud实现心跳监测,在服务注册和停止时,注册中心能得到通知,并更新服务实例列表 Spring Cloud注册中心添加配置: eureka.server.enable-self-pre ...

  7. [Spring Framework]学习笔记--@Component等stereotype的基础

    在继续讲解Spring MVC之前,需要说一下常用的几个用来标记stereotype的annotation. @Component,@Controller,@Repository,@Service. ...

  8. Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署

    Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署 系统版本:CentOS Linux release 7.4.1708 (Core) 最小化安装 内核版本:3.10.0-693. ...

  9. cocos2dx遇到的一些坑

    针对2.x 1.CCSprite无法直接用文件名更换图片,可以添加如下函数 bool CCSprite::setWithFile(const char *pszFilename) { CCAssert ...

  10. Python中import和from import

    Python里面的import和from import都是用于导入一个模块,两者的区别是 如果你在使用某模块内函数时不想写模块名,那么就用from import方式导入,如果是用import方式就要写 ...