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 ...
随机推荐
- Redis中的事务及乐观锁的实现
介绍 Redis中的事务(transaction)是一组命令的集合. 事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行. Redis事务的实现需要用 ...
- gulp程序怎么跑起来 及 使用中遇到的常见错误
gulp常见问题 问题一:Error: cannot find module 'gulp-concat' #16 解答:需要先npm install,然后执行gulp gulp安装及使用 一.安装no ...
- Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...
- 33. Search in Rotated Sorted Array (JAVA)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Django之modles 多对多创建第三张表
一.第一种:纯自动创建第三张表 纯自动 class Book(models.Model): title = models.CharField(max_length=32) price = models ...
- 使用vim打造python-ide
一.前言 一直希望在linux下进行python开发,但是linux不想启动图形化界面,所以干脆直接用上了万能的VIM,用VIM打造了属于自己的python-IDE 二.插件 标签导航(tagbar和 ...
- /proc/sys/fs/file-max
Linux的/proc/sys/fs/file-max决定了当前内核可以打开的最大的文件句柄数. 查看当前的值: cat /proc/sys/fs/file-max 这个值在kernel的文档里是这样 ...
- Revolver Maps-3D地球仪网站定制
这是个网站统计的小插件,大家可以看到那些国家,哪些城市对本网站进行了访问,很直观的一种表现方式. 这个小插件不需要你写任何代码,只需要去它官方网站定制你自己需要的代码.它的地址是:http://www ...
- 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息
三种控制DIV内容滚动的方法: 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv ...
- 细数不懂Spring底层原理带来的伤与痛
原文链接:https://www.jianshu.com/p/c9de414221ac?utm_campaign=haruki&utm_content=note&utm_medium= ...