2019 Nanchang Onsite
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的板子代码借鉴群里大佬的。
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <vector>
- #include <set>
- #include <cmath>
- #include <queue>
- #include <map>
- #include <cassert>
- const int maxn = 1e5 + ;
- const int mod = 1e5 + ;
- using namespace std;
- typedef long long ll;
- const double PI = acos(-1.0);
- namespace fft
- {
- struct num
- {
- double x, y;
- num()
- {
- x = y = ;
- }
- num(double x, double y) : x(x), y(y) {}
- };
- inline num operator+(num a, num b)
- {
- return num(a.x + b.x, a.y + b.y);
- }
- inline num operator-(num a, num b)
- {
- return num(a.x - b.x, a.y - b.y);
- }
- inline num operator*(num a, num b)
- {
- return num(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
- }
- inline num conj(num a)
- {
- return num(a.x, -a.y);
- }
- int base = ;
- vector<num> roots = {{, }, {, }};
- vector<int> rev = {, };
- const double PI = acosl(-1.0);
- void ensure_base(int nbase)
- {
- if (nbase <= base)
- return;
- rev.resize( << nbase);
- for (int i = ; i < ( << nbase); i++)
- rev[i] = (rev[i >> ] >> ) + ((i & ) << (nbase - ));
- roots.resize( << nbase);
- while (base < nbase)
- {
- double angle = * PI / ( << (base + ));
- for (int i = << (base - ); i < ( << base); i++)
- {
- roots[i << ] = roots[i];
- double angle_i = angle * ( * i + - ( << base));
- roots[(i << ) + ] = num(cos(angle_i), sin(angle_i));
- }
- base++;
- }
- }
- void fft(vector<num> &a, int n = -)
- {
- if (n == -)
- n = a.size();
- assert((n & (n - )) == );
- int zeros = __builtin_ctz(n);
- ensure_base(zeros);
- int shift = base - zeros;
- for (int i = ; i < n; i++)
- if (i < (rev[i] >> shift))
- swap(a[i], a[rev[i] >> shift]);
- for (int k = ; k < n; k <<= )
- {
- for (int i = ; i < n; i += * k)
- {
- for (int j = ; j < k; j++)
- {
- num z = a[i + j + k] * roots[j + k];
- a[i + j + k] = a[i + j] - z;
- a[i + j] = a[i + j] + z;
- }
- }
- }
- }
- vector<num> fa, fb;
- vector<int> multiply_mod(vector<int> &a, vector<int> &b, int m, int eq = )
- {
- int need = a.size() + b.size() - ;
- int nbase = ;
- while (( << nbase) < need)
- nbase++;
- ensure_base(nbase);
- int sz = << nbase;
- if (sz > (int)fa.size())
- fa.resize(sz);
- for (int i = ; i < (int)a.size(); i++)
- {
- int x = (a[i] % m + m) % m;
- fa[i] = num(x & (( << ) - ), x >> );
- }
- fill(fa.begin() + a.size(), fa.begin() + sz, num{, });
- fft(fa, sz);
- if (sz > (int)fb.size())
- fb.resize(sz);
- if (eq)
- copy(fa.begin(), fa.begin() + sz, fb.begin());
- else
- {
- for (int i = ; i < (int)b.size(); i++)
- {
- int x = (b[i] % m + m) % m;
- fb[i] = num(x & (( << ) - ), x >> );
- }
- fill(fb.begin() + b.size(), fb.begin() + sz, num{, });
- fft(fb, sz);
- }
- double ratio = 0.25 / sz;
- num r2(, -), r3(ratio, ), r4(, -ratio), r5(, );
- for (int i = ; i <= (sz >> ); i++)
- {
- int j = (sz - i) & (sz - );
- num a1 = (fa[i] + conj(fa[j]));
- num a2 = (fa[i] - conj(fa[j])) * r2;
- num b1 = (fb[i] + conj(fb[j])) * r3;
- num b2 = (fb[i] - conj(fb[j])) * r4;
- if (i != j)
- {
- num c1 = (fa[j] + conj(fa[i]));
- num c2 = (fa[j] - conj(fa[i])) * r2;
- num d1 = (fb[j] + conj(fb[i])) * r3;
- num d2 = (fb[j] - conj(fb[i])) * r4;
- fa[i] = c1 * d1 + c2 * d2 * r5;
- fb[i] = c1 * d2 + c2 * d1;
- }
- fa[j] = a1 * b1 + a2 * b2 * r5;
- fb[j] = a1 * b2 + a2 * b1;
- }
- fft(fa, sz);
- fft(fb, sz);
- vector<int> res(need);
- for (int i = ; i < need; i++)
- {
- ll aa = fa[i].x + 0.5;
- ll bb = fb[i].x + 0.5;
- ll cc = fa[i].y + 0.5;
- res[i] = (aa + ((bb % m) << ) + ((cc % m) << )) % m;
- }
- return res;
- }
- vector<int> square_mod(vector<int> &a, int m)
- {
- return multiply_mod(a, a, m, );
- }
- }; // namespace fft
- inline int quick(int a, int b, int m)
- {
- int ans = ;
- while (b)
- {
- if (b & )
- {
- ans = (1LL * a * ans) % m;
- }
- a = (1LL * a * a) % m;
- b >>= ;
- }
- return ans;
- }
- vector<int> v[maxn];
- inline ll inverse(ll a, ll p) { return quick(a, p - , p); }
- vector<int> solve(int l, int r)
- {
- if (l == r)
- return v[l];
- int mid = (l + r) >> ;
- vector<int> v1 = (solve(l, mid));
- vector<int> v2 = solve(mid + , r);
- return fft::multiply_mod(v1, v2, mod);
- }
- int comb[maxn];
- int main()
- {
- int n, a, q;
- scanf("%d%d%d", &n, &a, &q);
- comb[] = ;
- for (int i = ; i <= n; i++)
- {
- comb[i] = 1LL * comb[i - ] * (n + - i) * inverse(i, mod) % mod;
- }
- for (int i = , s; i <= n; i++)
- {
- scanf("%d", &s);
- v[i].push_back(quick(a % mod, s, mod));
- v[i].push_back();
- }
- vector<int> ans = solve(, n);
- while (q--)
- {
- int k;
- scanf("%d", &k);
- int cnt = 1LL * (ans[n - k] - comb[k]) * inverse(a - , mod) % mod;
- if (cnt < )
- cnt += mod;
- printf("%d\n", cnt);
- }
- return ;
- }
2019 Nanchang Onsite的更多相关文章
- 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\), ...
- The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- 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 ...
- 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 种不可能 ...
- 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相连的,一共有两 ...
- 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)
solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...
- 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)
solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...
- 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 ...
随机推荐
- 使用axios发送ajax请求
1.安装 npm install axios 2.在Home.vue中引入 import axios from 'axios' export default { name: 'Home', c ...
- 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 ...
- 测试员小白必经之路----常见的Dos命令
Dos是什么? 是一个命令行执行的操作系统 进入终端: win + r 运行输入: cmd 当前计算机的本地时间:Time 退出当前正在执行的命令: ctrl +c 设置在多少时间后自动关机: Shu ...
- Django发送邮件功能
以126邮箱为例 1 首先进126邮箱设置,开启: POP3/SMTP服务 IMAP/SMTP服务 成功开启后会获得一个授权码. 2. setting.py配置: # 配置发送邮箱 # 需要登录网 ...
- Linux 开机自动启动脚本
1)编写要执行脚本的sh文件mysetup.sh #!/bin/sh ### BEGIN INIT INFO # Provides: land.sh # Required-start: $local_ ...
- PHP简单的爬虫–原型
1.PHP简单的爬虫–原型 爬虫的原理: 给定原始的url: 分析链接,根据设置的正则表达式获取链接中的内容: 有的会更新原始的url再进行分析链接,获取特定内容,周而复始. 将获取的内容保存在数据库 ...
- php iconv函数转换出错问题
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- react 详细解析学习笔记
React的介绍: React来自于Facebook公司的开源项目 React 可以开发单页面应用 spa(单页面应用) react 组件化模块化 开发模式 React通过对DOM的模拟 ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- 【leetcode】1143. Longest Common Subsequence
题目如下: Given two strings text1 and text2, return the length of their longest common subsequence. A su ...