题解

这个乘积比较麻烦,转换成原根的指数乘法就相当于指数加和了,可以NTT优化

注意判掉0

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define pdi pair<db,int>
  6. #define mp make_pair
  7. #define pb push_back
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define MAXN 1000005
  13. //#define ivorysi
  14. using namespace std;
  15. typedef long long int64;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;char c = getchar();T f = 1;
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 + c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. const int MOD = 1004535809,MAXL = (1 << 14);
  39. int W[MAXL + 5],N,M,x,S;
  40. int pos[8005],pw[8005],f[MAXL + 5],r[MAXL + 5],tmp[MAXL + 5];
  41. int inc(int a,int b) {
  42. return a + b >= MOD ? a + b - MOD : a + b;
  43. }
  44. int fpow(int x,int c,int M = MOD) {
  45. int res = 1,t = x;
  46. while(c) {
  47. if(c & 1) res = 1LL * res * t % M;
  48. t = 1LL * t * t % M;
  49. c >>= 1;
  50. }
  51. return res;
  52. }
  53. int primitive_root(int p) {
  54. for(int g = 2 ; ; ++g) {
  55. bool flag = 1;
  56. for(int i = 2 ; i <= (p - 1) / i ; ++i) {
  57. if((p - 1) % i == 0) {
  58. if(fpow(g,(p - 1) / i,p) == 1 || fpow(g,i,p) == 1) {
  59. flag = 0;
  60. break;
  61. }
  62. }
  63. }
  64. if(flag) return g;
  65. }
  66. }
  67. void NTT(int *p,int L,int on) {
  68. for(int i = 1 , j = L >> 1 ; i < L - 1 ; ++i) {
  69. if(i < j) swap(p[i],p[j]);
  70. int k = L >> 1;
  71. while(j >= k) {
  72. j -= k;
  73. k >>= 1;
  74. }
  75. j += k;
  76. }
  77. for(int h = 2 ; h <= L ; h <<= 1) {
  78. int wn = W[(MAXL + on * MAXL / h) % MAXL];
  79. for(int k = 0 ; k < L ; k += h) {
  80. int w = 1;
  81. for(int j = k ; j < k + h / 2 ; ++j) {
  82. int u = p[j],t = 1LL * p[j + h / 2] * w % MOD;
  83. p[j] = inc(u,t);
  84. p[j + h / 2] = inc(u,MOD - t);
  85. w = 1LL * w * wn % MOD;
  86. }
  87. }
  88. }
  89. if(on == -1) {
  90. int InvL = fpow(L,MOD - 2);
  91. for(int i = 0 ; i < L ; ++i) p[i] = 1LL * p[i] * InvL % MOD;
  92. }
  93. }
  94. void Solve() {
  95. read(N);read(M);read(x);read(S);
  96. W[0] = 1;
  97. W[1] = fpow(3,(MOD - 1) / MAXL);
  98. for(int i = 2 ; i < MAXL ; ++i) {
  99. W[i] = 1LL * W[i - 1] * W[1] % MOD;
  100. }
  101. int t = primitive_root(M);
  102. pw[0] = 1;pw[1] = t;
  103. for(int i = 2 ; i < M ; ++i) pw[i] = 1LL * pw[i - 1] * pw[1] % M;
  104. for(int i = 0 ; i < M - 1 ; ++i) pos[pw[i]] = i;
  105. int k;
  106. for(int i = 1 ; i <= S ; ++i) {
  107. read(k);
  108. if(!k) continue;
  109. f[pos[k]] = 1;
  110. }
  111. k = 1;
  112. while(k <= 2 * M) k <<= 1;
  113. r[0] = 1;
  114. while(N) {
  115. NTT(f,k,1);
  116. if(N & 1) {
  117. NTT(r,k,1);
  118. for(int i = 0 ; i < k ; ++i) r[i] = 1LL * r[i] * f[i] % MOD;
  119. NTT(r,k,-1);
  120. for(int i = M - 1 ; i < k ; ++i) {r[i % (M - 1)] = inc(r[i % (M - 1)],r[i]);r[i] = 0;}
  121. }
  122. for(int i = 0 ; i < k ; ++i) f[i] = 1LL * f[i] * f[i] % MOD;
  123. NTT(f,k,-1);
  124. for(int i = M - 1 ; i < k ; ++i) {f[i % (M - 1)] = inc(f[i % (M - 1)],f[i]);f[i] = 0;}
  125. N >>= 1;
  126. }
  127. out(r[pos[x]]);enter;
  128. }
  129. int main() {
  130. #ifdef ivorysi
  131. freopen("f1.in","r",stdin);
  132. #endif
  133. Solve();
  134. return 0;
  135. }

【LOJ】#2183. 「SDOI2015」序列统计的更多相关文章

  1. LOJ #2183「SDOI2015」序列统计

    有好多好玩的知识点 LOJ 题意:在集合中选$ n$个元素(可重复选)使得乘积模$ m$为$ x$,求方案数对$ 1004535809$取模 $ n<=10^9,m<=8000且是质数,集 ...

  2. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  3. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  4. LOJ 3158: 「NOI2019」序列

    题目传送门:LOJ #3158. 题意简述: 给定两个长度为 \(n\) 的正整数序列 \(a,b\),要求在每个序列中都选中 \(K\) 个下标,并且要保证同时在两个序列中都被选中的下标至少有 \( ...

  5. LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分

    题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...

  6. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  9. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

随机推荐

  1. 后Hadoop时代的大数据技术思考:数据即服务

    1. Hadoop 的神话正在破灭 IBM leads BigInsights for Hadoop out behind barn. Shots heard IBM has announced th ...

  2. 在Mac上快速Kill掉Tomcat

    最近IDEA总是会莫名其妙的挂掉,而挂掉之后通过IDEA开启的Tomcat却没有同步给关掉,等我再在IDEA里要启动的时候,就不行了.... 这时,就需要手动去kill掉tomcat,每次先 ps - ...

  3. Problem A: 道路建设 解题报告

    一定存在一个最优解是一条链 否则可以接上去,不会更差 边权最小的边一定在这条链上 这个比较显然 可以把所有边都减去这个最后加上就行了 把链上的边按距离当前根的深度从小到大排列,设第一个零边位置为\(k ...

  4. 解决小米note5 安装了google play store 打不开的问题

    打不开的原因是缺少了google play store 运行的一些后台程序 去豌豆荚下载如下谷歌安装器(注:安装器有很多种,我试了如下这种成功) 重启手机,google play store 即可正常 ...

  5. 使用 EXISTS 代替 IN 和 inner join

    在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般写s ...

  6. css3背景颜色渐变属性 兼容性测试基础环境为:windows系统;IE6.0+, Firefox4.0+, Chrome4.0+, Safari4.0+, Opera15.0+

    css3背景颜色渐变属性 兼容性测试基础环境为:windows系统:IE6.0+, Firefox4.0+, Chrome4.0+, Safari4.0+, Opera15.0+ 语法: <li ...

  7. Java基础-算术运算符(Arithmetic Operators)

    Java基础-算术运算符(Arithmetic Operators) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java程序通过运算符实现对数据的处理,Java中的运算符包括: ...

  8. 深度学习 vs. 概率图模型 vs. 逻辑学

    深度学习 vs. 概率图模型 vs. 逻辑学 摘要:本文回顾过去50年人工智能(AI)领域形成的三大范式:逻辑学.概率方法和深度学习.文章按时间顺序展开,先回顾逻辑学和概率图方法,然后就人工智能和机器 ...

  9. mysql先排序在分组

    – 表的结构 `test`– CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varcha ...

  10. J2EE架构

    从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应 ...