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的更多相关文章

  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. vue生命周期简单总结

    生命周期(钩子函数):一个组件从创建到销毁的过程就是生命周期     beforeCreate: 创建前     1.当前vue实例化的时候会做一个初始化的操作,在这个生命周期函数中我们可以做初始化的 ...

  2. vue项目1-pizza点餐系统10-axios实现登陆

    一.登陆思路 从数据库中拿到数据,每个用户信息都是一个对象,需要用数组存储对象信息,然后对比输入的用户信息,如果匹配成功就跳转到home主页,否则提示用户或密码错误. 二.具体操作 1.导入axios ...

  3. Java 应用中的日志

    frankiegao123 芋道源码 日志在应用程序中是非常非常重要的,好的日志信息能有助于我们在程序出现 BUG 时能快速进行定位,并能找出其中的原因. 但是,很多介绍 AOP 的地方都采用日志来作 ...

  4. EFL - Championship

    Swansea City       Charlton AthleticBristol CityLeeds UnitedPreston North EndWest Bromwich AlbionQue ...

  5. AlertDialog用法。

    AlertDialog 可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此一般 AlertDialog 都是用于提示一些非常重要的内容或者警告信息 ...

  6. Thinking in Annotation

    Thinking in Java这本书很久前就购买了,打算有时间看一下,因为自己的时间被自己安排的紧张,也没时间看书.黄师傅上次课程讲到了注解的使用和反射的使用,今天打算学习一下注解.该文章参考Thi ...

  7. 北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学)

    链接:https://ac.nowcoder.com/acm/contest/3/D 来源:牛客网 Disdain Chain 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  8. [HTTP知识体系]前端常用的一些参数

    1.http常见状态码(status code) 200(成功) 服务器已成功处理了请求.通常,这表示服务器提供了请求的网页. 301 (永久移动) 请求的网页已永久移动到新位置. 服务器返回此响应( ...

  9. 小程序makePhoneCall拨打电话问题

    调用wx.makePhoneCall后肯定会弹出一个询问框,此时无论是点击确认或者取消,页面都会依次触发app.js中的onHide函数和onShow函数,所以需要注意

  10. TCP/IP基础总结性学习(5)

    与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 一. 用单台虚拟主机实现多个域名 HTTP/1.1 规范允许 ...