和https://www.cnblogs.com/xzz_233/p/10060753.html一样,都是多项式快速幂,还比那个题水。

设\(a[i]\)表示\([1,m]\)中$ \mod p\(余\)i\(的数的个数,\)f[i][j]\(表示用\)i\(个\)[1,m]\(中的数凑出\)j$的方案数

那么转移方程是\(f[i][j]=\sum_{k=0}^{p-1}f[i-1][(j-k)\mod m]\times a[k]\)

直接多项式快速幂即可

但是还有2条件,至少选一个质数,其实就是全都能选的减去不选质数的方案数

另外,这个模数要用MTT,贼简单,懒得写了,咕咕咕

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 20170408
#define M 4491
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef std::complex<double> cp;
int n,m,p,ANS;
int rev[257],N,lg;
cp FA[257],FB[257],GA[257],GB[257],omg[257],inv[257];
struct naive{
int t[100];
il int& operator [](int x){return t[x];}
};
il vd fft(cp*A,int n,cp*omg){
for(int i=0;i<N;++i)if(rev[i]>i)std::swap(A[rev[i]],A[i]);
for(int o=1;o<n;o<<=1)
for(cp*p=A;p!=A+n;p+=o<<1)
for(int i=0;i<o;++i){
cp t=omg[n/(o<<1)*i]*p[i+o];
p[i+o]=p[i]-t,p[i]+=t;
}
}
cp A[257];
il vd work(cp*a,cp*b,int*s,int k){
for(int i=0;i<N;++i)A[i]=a[i]*b[i];
fft(A,N,inv);
for(int i=0;i<N;++i)s[i%p]=(s[i%p]+k*((ll)(A[i].real()/N+0.5)%mod))%mod;
}
il naive operator *(naive&a,naive&b){
for(int i=0;i<p;++i)FA[i]=a[i]/M,FB[i]=a[i]%M;
for(int i=0;i<p;++i)GA[i]=b[i]/M,GB[i]=b[i]%M;
for(int i=p;i<N;++i)FA[i]=FB[i]=GA[i]=GB[i]=0;
fft(FA,N,omg),fft(FB,N,omg),fft(GA,N,omg),fft(GB,N,omg);
naive ret;for(int i=0;i<p;++i)ret[i]=0;
work(FA,GA,ret.t,M*M);work(FA,GB,ret.t,M);work(FB,GA,ret.t,M);work(FB,GB,ret.t,1);
return ret;
}
const double pi=acos(-1);
int main(){
n=gi(),m=gi(),p=gi(),ANS=0;
N=1,lg=0;while(N<p<<1)N<<=1,++lg;
for(int i=0;i<N;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
for(int i=0;i<N;++i)omg[i]=cp(cos(i*pi*2/N),sin(i*pi*2/N)),inv[i]=conj(omg[i]);
naive ans,x;
for(int i=0;i<p;++i)ans[i]=0;ans[0]=1;
for(int i=0;i<p;++i)x[i]=m/p;
for(int i=m/p*p+1;i<=m;++i)++x[i%p];
int y=n;
while(y){
if(y&1)ans=ans*x;
x=x*x;y>>=1;
}
ANS+=ans[0];
static int pri[20000000],pr=0;
static bool yes[20000001];
for(int i=0;i<p;++i)ans[i]=0;ans[0]=1;
for(int i=0;i<p;++i)x[i]=0;
yes[1]=1;
for(int i=2;i<=m;++i){
if(!yes[i])pri[++pr]=i;
for(int j=1;j<=pr&&i*pri[j]<=m;++j){
yes[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
for(int i=1;i<=m;++i)x[i%p]+=yes[i];
for(int i=0;i<p;++i)x[i]%=mod;
y=n;
while(y){
if(y&1)ans=ans*x;
x=x*x;y>>=1;
}
ANS-=ans[0];
printf("%d\n",(ANS+mod)%mod);
return 0;
}

洛咕 P3702 [SDOI2017]序列计数的更多相关文章

  1. 洛谷P3702 [SDOI2017]序列计数

    题目大意: Alice想要得到一个长度为\(n\)的序列,序列中的数都是不超过\(m\)的正整数,而且这\(n\)个数的和是\(p\)的倍数. Alice还希望,这\(n\)个数中,至少有一个数是质数 ...

  2. P3702 [SDOI2017]序列计数

    P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...

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

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

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

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

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

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

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

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

  7. 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法

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

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

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

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

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

随机推荐

  1. Oracle EBS INV 删除保留

    DECLARE p_rsv apps.inv_reservation_global.mtl_reservation_rec_type; p_dummy_sn apps.inv_reservation_ ...

  2. [SQLSERVER] [RESTORE] 逐步恢复日志备份并使用只读模式查看

    执行: USE master GO RESTORE DATABASE MYDB FROM DISK = N'FULL_BACKUP.bak' WITH REPLACE, STANDBY = N'STA ...

  3. USB AUDIO Device CLASS Requests

    写在前面 本文翻译自 USB Device Class Definition for Audio Devices 1998年版.主要是鄙人个人使用,所以只挑对我有用的翻译.有些我认为不是很重要的可能就 ...

  4. Cisco ASA 使用ASDM 配置管理口 方法

    CISCO ASA防火墙ASDM安装和配置 准备一条串口线一边接台式机或笔记本一边接防火墙的CONSOLE 接口,通过CRT或者超级终端连接ASA在用ASDM图形管理界面之前须在串口下输入一些命令开启 ...

  5. [Spark Core] Spark Client Job 提交三级调度框架

    0. 说明  官方文档  Job Scheduling Spark 调度核心组件: DagScheduler TaskScheduler BackendScheduler 1. DagSchedule ...

  6. CentOS7 配置静态 ip

    1. 为 CentOS7 配置静态 ip 1.1 修改文件/etc/sysconfig/network-scripts/ifcfg-ens33 sudo vi /etc/sysconfig/netwo ...

  7. MongoDB之 复制集搭建

    MongoDB复制集搭建步骤,本次搭建使用3台机器,一个是主节点,一个是从节点,一个是仲裁者. 主节点负责与前台客户端进行数据读写交互,从节点只负责容灾,构建高可用,冗余备份.仲裁者的作用是当主节点宕 ...

  8. MySQL数据库常用操作和技巧

    MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...

  9. 在react中使用intro.js的的一些经验

    react逐渐热了起来,但是新的东西毕竟前辈的经验少一些,前段时间自己在react中用到intro.js时,得到的资料甚少,摸索后便将一些心得记录下来了~ 1 intro.js的引入,这一点请看上一篇 ...

  10. shp转oracle spatial

    2010年12月1日  终于搞定了shp到oracle spatial,说下步骤和感受吧! 1 XP系统:转换工具的下载(shp2sdo.exe ):下载后把此文件复制到PATH变量包含的目录下(E: ...