今天开始学习丧心病狂的多项式qaq......    .

code:

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define setIO(s) freopen(s".in","r",stdin)
  4. using namespace std;
  5. int qpow(int x,int y,int mod)
  6. {
  7. int res=1;
  8. while(y)
  9. {
  10. if(y&1) res=1ll*res*x%mod;
  11. x=1ll*x*x%mod;
  12. y>>=1;
  13. }
  14. return res;
  15. }
  16. const int Mod=1004535809,G=3,iG=qpow(G,Mod-2,Mod),MAX_M=300000;
  17. int fact[10000];
  18. int GetRoot(int x)
  19. {
  20. int tot=0;
  21. int phi=x-1;
  22. for(int i=2;i*i<=phi;++i) if(phi%i==0) { fact[++tot]=i; while(phi%i==0) phi/=i; }
  23. if(phi>1) fact[++tot]=phi;
  24. phi=x-1;
  25. for(int i=2;i<=phi;++i)
  26. {
  27. bool flag=1;
  28. for(int j=1;j<=tot&&flag;++j)
  29. if(qpow(i,phi/fact[j],x)==1) flag=0;
  30. if(flag) return i;
  31. }
  32. return -1;
  33. }
  34. int limit,rev[MAX_M];
  35. void NTT(int *p,int op)
  36. {
  37. for(int i=0;i<limit;++i) if(i<rev[i]) swap(p[i],p[rev[i]]);
  38. for(int i=1;i<limit;i<<=1)
  39. {
  40. int rot=qpow(op==1?G:iG,(Mod-1)/(i<<1),Mod);
  41. for(int j=0;j<limit;j+=(i<<1))
  42. {
  43. int w=1;
  44. for(int k=0;k<i;++k,w=1ll*w*rot%Mod)
  45. {
  46. int x=p[j+k],y=1ll*w*p[i+k+j]%Mod;
  47. p[j+k]=(x+y)%Mod, p[i+j+k]=(x-y+Mod)%Mod;
  48. }
  49. }
  50. }
  51. if(op==-1)
  52. {
  53. int inv=qpow(limit,Mod-2,Mod);
  54. for(int i=0;i<limit;++i) p[i]=1ll*p[i]*inv%Mod;
  55. }
  56. }
  57. map<int,int>mp;
  58. int N,M,S,X,F[MAX_M],H[MAX_M];
  59. void mul(int *A,int *B,int *C)
  60. {
  61. static int res[MAX_M],a[MAX_M],b[MAX_M];
  62. for(int i=0;i<limit;++i) a[i]=A[i],b[i]=B[i];
  63. NTT(a,1), NTT(b,1);
  64. for(int i=0;i<limit;++i) a[i]=1ll*a[i]*b[i]%Mod;
  65. NTT(a,-1);
  66. for(int i=0;i<M-1;++i) res[i]=(a[i]+a[i+M-1])%Mod;
  67. for(int i=0;i<M-1;++i) C[i]=res[i];
  68. }
  69. int main()
  70. {
  71. // setIO("input");
  72. scanf("%d%d%d%d",&N,&M,&X,&S);
  73. int g=GetRoot(M);
  74. for(int i=0;i<M-1;++i) mp[qpow(g,i,M)]=i;
  75. for(int i=1,x;i<=S;++i)
  76. {
  77. scanf("%d",&x);
  78. x%=M;
  79. if(x) F[mp[x%M]]++;
  80. }
  81. H[mp[1]]=1;
  82. int p=0;
  83. for(limit=1;limit<=2*M;limit<<=1,++p);
  84. for(int i=0;i<limit;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(p-1));
  85. while(N)
  86. {
  87. if(N&1) mul(H,F,H);
  88. mul(F,F,F);
  89. N>>=1;
  90. }
  91. printf("%d\n",H[mp[X]]);
  92. return 0;
  93. }

  

bzoj 3992: [SDOI2015]序列统计 NTT+原根的更多相关文章

  1. BZOJ 3992: [SDOI2015]序列统计 NTT+快速幂

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1155  Solved: 532[Submit][Statu ...

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

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

  3. bzoj 3992 [SDOI2015]序列统计——NTT(循环卷积&&快速幂)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 有转移次数.模M余数.方案数三个值,一看就是系数的地方放一个值.指数的地方放一个值.做 ...

  4. bzoj 3992 [SDOI2015] 序列统计 —— NTT (循环卷积+快速幂)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 (学习NTT:https://riteme.github.io/blog/2016-8 ...

  5. BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)

    3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...

  6. [BZOJ 3992][SDOI2015]序列统计

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 2275  Solved: 1090[Submit][Stat ...

  7. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  8. BZOJ.3992.[SDOI2015]序列统计(DP NTT 原根)

    题目链接 \(Description\) 给定\(n,m,x\)和集合\(S\).求\(\prod_{i=1}^na_i\equiv x\ (mod\ m)\)的方案数.其中\(a_i\in S\). ...

  9. 【BZOJ】3992: [SDOI2015]序列统计 NTT+生成函数

    [题意]给定一个[0,m-1]范围内的数字集合S,从中选择n个数字(可重复)构成序列.给定x,求序列所有数字乘积%m后为x的序列方案数%1004535809.1<=n<=10^9,3< ...

随机推荐

  1. C++删除排序数组中的重复项

    class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) { ; } ...

  2. python 笔记——生成器和迭代器

    #-*- coding:utf-8 -*- a=[1,2,3,4] for i,j in enumerate(a): print i,j '''只有ij时,''' a=[1,2,3,4] for i ...

  3. async与await总结

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11533174.html,多谢,=.=~ 抛出3个疑问: 1.async是干哈的? 2.await ...

  4. FusionInsight大数据开发---SparkStreaming概述

    SparkStreaming概述 SparkStreaming是Spark核心API的一个扩展,它对实时流式数据的处理具有可扩展性.高吞吐量.可容错性等特点. SparkStreaming原理 Spa ...

  5. Replication:The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'

    今天早上,Dev跟我说,执行query statement时出现一个error,detail info是: “The transaction log for database 'tempdb' is ...

  6. Replication:The replication agent has not logged a progress message in 10 minutes.

    打开Replication Monitor,在Subscription Watch List Tab中,发现有大量的status= “Performance critical” 的黄色Warning, ...

  7. k8s-Label(标签)

    k8s-Label(标签) 一.Label是什么? Label是Kubernetes系统中的一个核心概念.Label以key/value键值对的形式附加到各种对象上,如Pod.Service.RC.N ...

  8. asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)

    这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示 样例代码下载: Cors 一.提供服务方,这里使用的是API 1.创建一个API项目.或者直接 ...

  9. 象棋中“车”的攻击范围_Java

    代码如下: String[][] a = new String[8][8]; int h, l; Scanner scan = new Scanner(System.in); System.out.p ...

  10. Django---简易图书管理系统(B/S架构)

    Django---简易图书管理系统 一丶配置 创建app01 # 1.在具有manage.py文件的目录下,启动cmd,创建一个新的app01 python manage.py startapp ap ...