【BZOJ4818】序列计数(生成函数)

题面

BZOJ

题解

显然是求一个多项式的若干次方,并且是循环卷积

或者说他是一个\(dp\)也没有问题

发现项数很少,直接暴力乘就行了(\(FFT\)可能还慢一些)

然后容斥减掉没有质数的就行了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MOD 20170408
#define MAX 20000200
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,p;
int a[100],b[100],c[100];
int ret[100];
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
void Multi(int *a,int *b,int *c)
{
for(int i=0;i<p;++i)ret[i]=0;
for(int i=0;i<p;++i)
for(int j=0;j<p;++j)
add(ret[(i+j)%p],1ll*a[i]*b[j]%MOD);
for(int i=0;i<p;++i)c[i]=ret[i];
}
void fpow(int *a,int b,int *s)
{
for(int i=0;i<p;++i)s[i]=0;s[0]=1;
while(b){if(b&1)Multi(a,s,s);Multi(a,a,a);b>>=1;}
}
bool zs[MAX];
int pri[MAX/10],tot=0;
int main()
{
n=read();m=read();p=read();
for(int i=0;i<p;++i)a[i]=m/p;
for(int i=1;i<=m%p;++i)a[i]++;
fpow(a,n,b);
for(int i=0;i<p;++i)a[i]=m/p;
for(int i=1;i<=m%p;++i)a[i]++;
for(int i=2;i<=m;++i)
{
if(!zs[i])pri[++tot]=i,a[i%p]--;
for(int j=1;j<=tot&&i*pri[j]<=m;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j]==0)break;
}
}
fpow(a,n,c);add(b[0],MOD-c[0]);
printf("%d\n",b[0]);
return 0;
}

【BZOJ4818】序列计数(动态规划,生成函数)的更多相关文章

  1. BZOJ4818 序列计数

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...

  2. BZOJ4818 [SDOI2017]序列计数 【生成函数 + 快速幂】

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P3702 [SDOI2017]序列计数

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

随机推荐

  1. SAP技术专家的ABAP调试器培训材料

    首先弄清楚ABAP Classic调试器和新调试器的区别: Classic debugger: (1) Static breakpoint a. BREAK-POINT : non-user spec ...

  2. 使用Swagger处理Api的显示与隐藏

    一.在SwaggerConfig.cs中配置如下: c.DocumentFilter<ShowApiFilter>(); c.DocumentFilter<HideApiFilter ...

  3. AngularJS中页面传参方法

    1.基于ui-router的页面跳转传参 (1) 用ui-router定义路由,比如有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的 ...

  4. Github 删除 repository

    Github 删除 repository 如下图操作

  5. PopupWindow学习笔记

    最近写程序第一次用到了PopupWindow,便简单了学习了一下.特此记下自己的收获.PopupWindow是一种悬浮框,比AlertDialog要灵活的多.先简单了实现一个PopWindow的效果, ...

  6. PowerDNS简单教程(4):优化篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇 http:/ ...

  7. Adobe flash player 因过期而遭到阻止解决办法

    最近使用谷歌浏览器时总是提示Adobe flash player 因过期而遭到阻止,这让人很头痛,基本上就是打开一个网页就会弹出一个提示,下面是解决办法. 问题的截图界面: 解决方法:在chrome浏 ...

  8. SQL Server的跨服务器数据访问方法

    想要在SQL服务器上访问另一个服务器的数据,可以采用此方式: 1.建立数据库链接: 右键“链接服务器”,选择“新建链接服务器...” 以上的操作也可以通过SQL脚本实现: exec sp_addlin ...

  9. WCF 双向通讯实例-简易的聊天程序

    源码下载 程序分四个部分: 1.原理 使用WCF的nettcp绑定.nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端. 2.代码展示 ...

  10. 日期插件kalendae,遇到的一些问题

    1.日期中文显示 /*_months : 'January_February_March_April_May_June_July_August_September_October_November_D ...