D.Interesting Series

F(n)实际上是一个等比数列的和,将它从递推式转变为通项公式(a^n-1)/(a-1),这里只需要确定n就可以。

题目要求选取k大小的所有子集的答案求和,可以先求a^n部分的和,把它写成母函数的形式(x+a^s1)(x+a^s2)...(x+a^sn),这样不断的分成两半,分别求出,然后再用fft卷积合并这两半,这一部分的和就是x^(n-k)的系数。

分母的a-1实际上还是a-1,分子的-1部分要变成C(n,k)

由于之前没怎么写过,fft的板子代码借鉴群里大佬的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <stack>
  8. #include <vector>
  9. #include <set>
  10. #include <cmath>
  11. #include <queue>
  12. #include <map>
  13. #include <cassert>
  14. const int maxn = 1e5 + ;
  15. const int mod = 1e5 + ;
  16. using namespace std;
  17. typedef long long ll;
  18. const double PI = acos(-1.0);
  19. namespace fft
  20. {
  21. struct num
  22. {
  23. double x, y;
  24. num()
  25. {
  26. x = y = ;
  27. }
  28. num(double x, double y) : x(x), y(y) {}
  29. };
  30. inline num operator+(num a, num b)
  31. {
  32. return num(a.x + b.x, a.y + b.y);
  33. }
  34. inline num operator-(num a, num b)
  35. {
  36. return num(a.x - b.x, a.y - b.y);
  37. }
  38. inline num operator*(num a, num b)
  39. {
  40. return num(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
  41. }
  42. inline num conj(num a)
  43. {
  44. return num(a.x, -a.y);
  45. }
  46.  
  47. int base = ;
  48. vector<num> roots = {{, }, {, }};
  49. vector<int> rev = {, };
  50. const double PI = acosl(-1.0);
  51.  
  52. void ensure_base(int nbase)
  53. {
  54. if (nbase <= base)
  55. return;
  56. rev.resize( << nbase);
  57. for (int i = ; i < ( << nbase); i++)
  58. rev[i] = (rev[i >> ] >> ) + ((i & ) << (nbase - ));
  59. roots.resize( << nbase);
  60. while (base < nbase)
  61. {
  62. double angle = * PI / ( << (base + ));
  63. for (int i = << (base - ); i < ( << base); i++)
  64. {
  65. roots[i << ] = roots[i];
  66. double angle_i = angle * ( * i + - ( << base));
  67. roots[(i << ) + ] = num(cos(angle_i), sin(angle_i));
  68. }
  69. base++;
  70. }
  71. }
  72.  
  73. void fft(vector<num> &a, int n = -)
  74. {
  75. if (n == -)
  76. n = a.size();
  77. assert((n & (n - )) == );
  78. int zeros = __builtin_ctz(n);
  79. ensure_base(zeros);
  80. int shift = base - zeros;
  81. for (int i = ; i < n; i++)
  82. if (i < (rev[i] >> shift))
  83. swap(a[i], a[rev[i] >> shift]);
  84. for (int k = ; k < n; k <<= )
  85. {
  86. for (int i = ; i < n; i += * k)
  87. {
  88. for (int j = ; j < k; j++)
  89. {
  90. num z = a[i + j + k] * roots[j + k];
  91. a[i + j + k] = a[i + j] - z;
  92. a[i + j] = a[i + j] + z;
  93. }
  94. }
  95. }
  96. }
  97.  
  98. vector<num> fa, fb;
  99.  
  100. vector<int> multiply_mod(vector<int> &a, vector<int> &b, int m, int eq = )
  101. {
  102. int need = a.size() + b.size() - ;
  103. int nbase = ;
  104. while (( << nbase) < need)
  105. nbase++;
  106. ensure_base(nbase);
  107. int sz = << nbase;
  108. if (sz > (int)fa.size())
  109. fa.resize(sz);
  110. for (int i = ; i < (int)a.size(); i++)
  111. {
  112. int x = (a[i] % m + m) % m;
  113. fa[i] = num(x & (( << ) - ), x >> );
  114. }
  115. fill(fa.begin() + a.size(), fa.begin() + sz, num{, });
  116. fft(fa, sz);
  117. if (sz > (int)fb.size())
  118. fb.resize(sz);
  119. if (eq)
  120. copy(fa.begin(), fa.begin() + sz, fb.begin());
  121. else
  122. {
  123. for (int i = ; i < (int)b.size(); i++)
  124. {
  125. int x = (b[i] % m + m) % m;
  126. fb[i] = num(x & (( << ) - ), x >> );
  127. }
  128. fill(fb.begin() + b.size(), fb.begin() + sz, num{, });
  129. fft(fb, sz);
  130. }
  131. double ratio = 0.25 / sz;
  132. num r2(, -), r3(ratio, ), r4(, -ratio), r5(, );
  133. for (int i = ; i <= (sz >> ); i++)
  134. {
  135. int j = (sz - i) & (sz - );
  136. num a1 = (fa[i] + conj(fa[j]));
  137. num a2 = (fa[i] - conj(fa[j])) * r2;
  138. num b1 = (fb[i] + conj(fb[j])) * r3;
  139. num b2 = (fb[i] - conj(fb[j])) * r4;
  140. if (i != j)
  141. {
  142. num c1 = (fa[j] + conj(fa[i]));
  143. num c2 = (fa[j] - conj(fa[i])) * r2;
  144. num d1 = (fb[j] + conj(fb[i])) * r3;
  145. num d2 = (fb[j] - conj(fb[i])) * r4;
  146. fa[i] = c1 * d1 + c2 * d2 * r5;
  147. fb[i] = c1 * d2 + c2 * d1;
  148. }
  149. fa[j] = a1 * b1 + a2 * b2 * r5;
  150. fb[j] = a1 * b2 + a2 * b1;
  151. }
  152. fft(fa, sz);
  153. fft(fb, sz);
  154. vector<int> res(need);
  155. for (int i = ; i < need; i++)
  156. {
  157. ll aa = fa[i].x + 0.5;
  158. ll bb = fb[i].x + 0.5;
  159. ll cc = fa[i].y + 0.5;
  160. res[i] = (aa + ((bb % m) << ) + ((cc % m) << )) % m;
  161. }
  162. return res;
  163. }
  164. vector<int> square_mod(vector<int> &a, int m)
  165. {
  166. return multiply_mod(a, a, m, );
  167. }
  168. }; // namespace fft
  169. inline int quick(int a, int b, int m)
  170. {
  171. int ans = ;
  172. while (b)
  173. {
  174. if (b & )
  175. {
  176. ans = (1LL * a * ans) % m;
  177. }
  178. a = (1LL * a * a) % m;
  179. b >>= ;
  180. }
  181. return ans;
  182. }
  183. vector<int> v[maxn];
  184. inline ll inverse(ll a, ll p) { return quick(a, p - , p); }
  185. vector<int> solve(int l, int r)
  186. {
  187. if (l == r)
  188. return v[l];
  189. int mid = (l + r) >> ;
  190. vector<int> v1 = (solve(l, mid));
  191. vector<int> v2 = solve(mid + , r);
  192. return fft::multiply_mod(v1, v2, mod);
  193. }
  194. int comb[maxn];
  195. int main()
  196. {
  197. int n, a, q;
  198. scanf("%d%d%d", &n, &a, &q);
  199. comb[] = ;
  200. for (int i = ; i <= n; i++)
  201. {
  202. comb[i] = 1LL * comb[i - ] * (n + - i) * inverse(i, mod) % mod;
  203. }
  204. for (int i = , s; i <= n; i++)
  205. {
  206. scanf("%d", &s);
  207. v[i].push_back(quick(a % mod, s, mod));
  208. v[i].push_back();
  209. }
  210. vector<int> ans = solve(, n);
  211. while (q--)
  212. {
  213. int k;
  214. scanf("%d", &k);
  215. int cnt = 1LL * (ans[n - k] - comb[k]) * inverse(a - , mod) % mod;
  216. if (cnt < )
  217. cnt += mod;
  218. printf("%d\n", cnt);
  219. }
  220. return ;
  221. }

2019 Nanchang Onsite的更多相关文章

  1. The 2019 Asia Nanchang First Round Online Programming Contest

    传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...

  2. The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)

    题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...

  3. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  4. 2019 CCPC-Wannafly Winter Camp Day2(Div2, onsite)

    solve 4/11 A Erase Numbers II Code:KK Thinking :KK 用ans表示当前最优答案,maxx表示遍历到的最大数字,一开始ans肯定等于a[ 1 ]+a[ 2 ...

  5. 2019 CCPC-Wannafly Winter Camp Day3(Div2, onsite)

    solve 4/11 补题:5/11 A 二十四点* Code:pai爷  zz Thinking :pai爷 打表找规律,1张牌 10个不可能的 2张牌有 43 种不可能的 3张牌 有74 种不可能 ...

  6. 2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)

    slove 6/11 A.夺宝奇兵 Code:zz Thinking:zz 贪心即可.这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两 ...

  7. 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)

    solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...

  8. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  9. 2019 The Preliminary Contest for ICPC China Nanchang National Invitational(A 、H 、I 、K 、M)

    A. PERFECT NUMBER PROBLEM 题目链接:https://nanti.jisuanke.com/t/38220 题意: 输出前五个完美数 分析: 签到.直接百度完美数输出即可 #i ...

随机推荐

  1. 使用axios发送ajax请求

    1.安装 npm install axios 2.在Home.vue中引入 import axios from 'axios' export default {   name: 'Home',   c ...

  2. Markov Chain Monte Carlo Simulation using C# and MathNet

    Math.Net Numerics has capability to conduct Markov Chair Monte Carlo simulations, yet the document i ...

  3. 测试员小白必经之路----常见的Dos命令

    Dos是什么? 是一个命令行执行的操作系统 进入终端: win + r 运行输入: cmd 当前计算机的本地时间:Time 退出当前正在执行的命令: ctrl +c 设置在多少时间后自动关机: Shu ...

  4. Django发送邮件功能

    以126邮箱为例 1 首先进126邮箱设置,开启: POP3/SMTP服务 IMAP/SMTP服务 成功开启后会获得一个授权码.   2. setting.py配置: # 配置发送邮箱 # 需要登录网 ...

  5. Linux 开机自动启动脚本

    1)编写要执行脚本的sh文件mysetup.sh #!/bin/sh ### BEGIN INIT INFO # Provides: land.sh # Required-start: $local_ ...

  6. PHP简单的爬虫–原型

    1.PHP简单的爬虫–原型 爬虫的原理: 给定原始的url: 分析链接,根据设置的正则表达式获取链接中的内容: 有的会更新原始的url再进行分析链接,获取特定内容,周而复始. 将获取的内容保存在数据库 ...

  7. php iconv函数转换出错问题

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  8. react 详细解析学习笔记

    React的介绍: React来自于Facebook公司的开源项目 React 可以开发单页面应用       spa(单页面应用) react 组件化模块化  开发模式 React通过对DOM的模拟 ...

  9. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  10. 【leetcode】1143. Longest Common Subsequence

    题目如下: Given two strings text1 and text2, return the length of their longest common subsequence. A su ...