转来的题面:

首先这题显然补集转化,就是用全部方案减去不含任何质数的方案。
然后怎么做呢?
考虑m比较小,我们能大力把<=m的质数全都筛出来。
发现n很大,要么倍增要么快速幂......
发现p相当小,所以我们能在mod p的同余系下做啊。

一看到同余系下求方案数立刻想到卷积和生成函数......
假设我们有一个多项式f(x),其中x^i的系数为a个数的序列mod p为i的方案数(a为我们引入的变量)。
同时我们有另一个多项式g(x),其中x^i的系数为b个数的序列mod p为i的方案数(b为我们引入的变量)。
那么,我们如果让f(x)和g(x)做卷积的话,新的多项式x^i的系数就是(a+b)个数的序列mod p为i的方案数的说。
这就是生成函数了。

回到这个题,我们先初始化多项式f(x),令x^i的系数为为1个数mod p为i的方案数。
然后我们求出这个多项式的n次方,就是我们需要的答案了。

发现这道题的p很小,我们连FFT都不用,直接用一个多项式类暴力快速幂就行了。复杂度O(m+p^2logn),跑的飞起。

话说为什么p才100啊,如果修改一下模数然后NTT的话,可以做到p为1e5级别,n为1e18级别的。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define debug cout
typedef long long int lli;
using namespace std;
const int maxn=1e2+1e1,maxl=2e7+1e2,lim=2e7;
const int mod=; bool vis[maxl];
int p,m; struct Poly {
lli dat[maxn];
Poly() {
memset(dat,,sizeof(dat));
}
lli& operator [] (const int &x) {
return dat[x];
}
const lli& operator [] (const int &x) const {
return dat[x];
}
friend Poly operator * (const Poly &a,const Poly &b) {
Poly ret;
for(int i=;i<p;i++) for(int j=;j<p;j++) {
( ret[(i+j)%p] += a[i] * b[j] % mod ) %= mod;
}
return ret;
}
}full,oly; inline void sieve() {
static int prime[maxl],cnt;
vis[] = ;
for(int i=;i<=m;i++) {
if( !vis[i] ) prime[++cnt] = i;
for(int j=;j<=cnt&&(lli)i*prime[j]<=m;j++) {
vis[i*prime[j]] = ;
if( ! ( i % prime[j] ) ) break;
}
}
} inline void init() {
for(int i=;i<=m;i++) {
full[i%p]++;
if( vis[i] ) oly[i%p]++;
}
} inline Poly fastpow(Poly base,int tim) {
Poly ret = base; --tim;
while( tim ) {
if( tim & ) ret = ret * base;
if( tim >>= ) base = base * base;
}
return ret;
} int main() {
static int n;
static lli ans;
scanf("%d%d%d",&n,&m,&p) , sieve();
init();
full = fastpow(full,n) , oly = fastpow(oly,n);
ans = ( full[] - oly[] + mod ) % mod;
printf("%lld\n",ans);
return ;
}

Bzoj4818:生成函数 快速幂的更多相关文章

  1. SARS病毒 (生成函数 + 快速幂)

    链接:https://ac.nowcoder.com/acm/contest/992/A来源:牛客网 题目描述 目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA ...

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

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

  3. 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂

    题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...

  4. 2018.12.31 bzoj3992: [SDOI2015]序列统计(生成函数+ntt+快速幂)

    传送门 生成函数简单题. 题意:给出一个集合A={a1,a2,...as}A=\{a_1,a_2,...a_s\}A={a1​,a2​,...as​},所有数都在[0,m−1][0,m-1][0,m− ...

  5. 【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演

    这题一看就觉得是生成函数的题... 我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案. 根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$ ...

  6. HDU 2065 "红色病毒"问题 ——快速幂 生成函数

    $A(x)=1+x^2/2!+x^4/4!...$ $A(x)=1+x^1/1!+x^2/2!...$ 然后把生成函数弄出来. 暴力手算. 发现结论. 直接是$4^{n-1}+2^{n-1}$ 然后快 ...

  7. bzoj 3992: [SDOI2015]序列统计【原根+生成函数+NTT+快速幂】

    还是没有理解透原根--题目提示其实挺明显的,M是质数,然后1<=x<=M-1 这种计数就容易想到生成函数,但是生成函数是加法,而这里是乘法,所以要想办法变成加法 首先因为0和任何数乘都是0 ...

  8. UOJ424 Count 生成函数、多项式求逆、矩阵快速幂

    传送门 两个序列相同当且仅当它们的笛卡尔树相同,于是变成笛卡尔树计数. 然后注意到每一个点的权值一定会比其左儿子的权值大,所以笛卡尔树上还不能够存在一条从根到某个节点的路径满足向左走的次数\(> ...

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

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

随机推荐

  1. 模拟生成环境的MySQL安装方法-通用二进制方式安装

    模拟生成环境的MySQL安装方法-通用二进制方式安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发响应用户请求的网络IO模型 1>.单进程 特点:一个进程响应一个请 ...

  2. bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋

    http://www.lydsy.com/JudgeOnline/problem.php?id=1800 圆上两条直径构成矩形的对角线 #include<cstdio> using nam ...

  3. Nginx模块之Nginx-Ts-Module学习笔记(一)抢险体验

    1.通过HTTP接收MPEG-TS2.生产和管理Live HLS 3.按照官方的编译和配置,当然了我是第一次编译没有通过,在作者重新调整下,编译成功,感谢:@arut https://github.c ...

  4. sql查询语句优化

    http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得 ...

  5. element-UI 下拉条数多渲染慢

    本文地址:https://www.cnblogs.com/veinyin/p/10120398.html 如果渲染为普通下拉框,用户难以找到要选择的那一项,增加模糊搜索功能,可解决渲染缓慢问题,但用户 ...

  6. matrix 矩阵(多维DP)

    题面 \(solution:\) 这一题其实就是一个非常明显的三维背包问题(但博主太弱了就10分QAQ) \(F[i][j][k]:\)表示走到\((i,j)\)这个位置并且背包容量为 \(k\) 时 ...

  7. Shell命令行中特殊字符与其转义详解(去除特殊含义)

    特殊符号及其转义 大家都知道在一个shell命令是由命令名和它的参数组成的, 比如 cat testfile, 其中cat是命令名, testfile是参数. shell将参数testfile传递给c ...

  8. python版本管理工具pyenv和包管理工具pipenv

    一.pyenv版本管理工具 pyenv是一个python版本管理工具,可以实现轻松切换多个python版本 它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理v ...

  9. jquery实现模拟select下拉框效果

    <IGNORE_JS_OP style="WORD-WRAP: break-word"> <!DOCTYPE html PUBLIC "-//W3C// ...

  10. InnoDB Lock浅谈

    数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性.InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S).排他锁(X).意向共享(IS).意向排他(IX).为了提供更好的并发,Inn ...