转来的题面:

首先这题显然补集转化,就是用全部方案减去不含任何质数的方案。
然后怎么做呢?
考虑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级别的。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define debug cout
  6. typedef long long int lli;
  7. using namespace std;
  8. const int maxn=1e2+1e1,maxl=2e7+1e2,lim=2e7;
  9. const int mod=;
  10.  
  11. bool vis[maxl];
  12. int p,m;
  13.  
  14. struct Poly {
  15. lli dat[maxn];
  16. Poly() {
  17. memset(dat,,sizeof(dat));
  18. }
  19. lli& operator [] (const int &x) {
  20. return dat[x];
  21. }
  22. const lli& operator [] (const int &x) const {
  23. return dat[x];
  24. }
  25. friend Poly operator * (const Poly &a,const Poly &b) {
  26. Poly ret;
  27. for(int i=;i<p;i++) for(int j=;j<p;j++) {
  28. ( ret[(i+j)%p] += a[i] * b[j] % mod ) %= mod;
  29. }
  30. return ret;
  31. }
  32. }full,oly;
  33.  
  34. inline void sieve() {
  35. static int prime[maxl],cnt;
  36. vis[] = ;
  37. for(int i=;i<=m;i++) {
  38. if( !vis[i] ) prime[++cnt] = i;
  39. for(int j=;j<=cnt&&(lli)i*prime[j]<=m;j++) {
  40. vis[i*prime[j]] = ;
  41. if( ! ( i % prime[j] ) ) break;
  42. }
  43. }
  44. }
  45.  
  46. inline void init() {
  47. for(int i=;i<=m;i++) {
  48. full[i%p]++;
  49. if( vis[i] ) oly[i%p]++;
  50. }
  51. }
  52.  
  53. inline Poly fastpow(Poly base,int tim) {
  54. Poly ret = base; --tim;
  55. while( tim ) {
  56. if( tim & ) ret = ret * base;
  57. if( tim >>= ) base = base * base;
  58. }
  59. return ret;
  60. }
  61.  
  62. int main() {
  63. static int n;
  64. static lli ans;
  65. scanf("%d%d%d",&n,&m,&p) , sieve();
  66. init();
  67. full = fastpow(full,n) , oly = fastpow(oly,n);
  68. ans = ( full[] - oly[] + mod ) % mod;
  69. printf("%lld\n",ans);
  70. return ;
  71. }

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. shell脚本中自定义日志记录到文件

    自定义日志函数和前期变量 # adirname - return absolute dirname of given file adirname() { odir=`pwd`; cd `dirname ...

  2. C语言复习---打印菱形

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...

  3. bzoj千题计划290:bzoj3143: [Hnoi2013]游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...

  4. VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二)

    准备工作 相关浏览: VMware Linux 下 Nginx 安装配置 (一) 1. 选在 /usr/local/ 下创建 softs 文件夹,通过 ftp 命令 把 apache-tomcat-7 ...

  5. JS判断客户浏览器是否是IE8浏览器、jQuery判断浏览器内核

    今天在使用encharts的时候由于要兼容IE8,所以最终决定在非IE8浏览器使用encharts,在IE8使用amcharts.于是需要使用JS判断使用的浏览器版本: function IEVers ...

  6. 搭建RabbitMQ集群(Docker)

    前一篇搭建RabbitMQ集群(通用)只是把笔记直接移动过来了,因为我的机器硬盘已经满了,实在是开不了那么虚拟机. 还好,我的Linux中安装了Docker,这篇文章就简单介绍一下Docker中搭建R ...

  7. request_irq与request_threaded_irq

    /* * Allocate the IRQ */ #if 0 retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011 ...

  8. git学习——Git 基础要点【转】

    转自:http://blog.csdn.net/zeroboundary/article/details/10549555 简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是 ...

  9. elasticsearch安装marvel插件

    Marvel插件要在Elasticsearch和Kibana中同时安装.Step 1: Install Marvel into Elasticsearch: bin/plugin install li ...

  10. WCF服务安全控制之netTcpBinding的用户名密码验证【转】

    选择netTcpBinding WCF的绑定方式比较多,常用的大体有四种: wsHttpBinding basicHttpBinding netTcpBinding wsDualHttpBinding ...