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. Linux安装 jdk&maven

    JDK安装 1. 下载JDK压缩包http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  2. django字段类型(Field types)介绍

    字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...

  3. linux中的文件类型以及查看文件类型的方法

    Linux文件类型和文件的文件名所代表的意义是两个不同的概念,在linux中文件类型与文件扩展名没有关系.它不像Windows那样是依靠文件后缀名来区分文件类型的,在linux中文件名只是为了方便操作 ...

  4. SpringBoot_04springDataJPA

    说明:底层使用Hibernate 一.springDataJPA和mybatisPlus的使用区别 第一步: 把mybatisPlus的依赖.配置删除 包括:实体类的注解.引导类的mapperScan ...

  5. 基于Red5与ffmpeg实现rtmp处理NVR或摄像头的监控视频处理方案

    背景 各大监控视频平台厂商与外对接均是基于IE的OCX插件方式提供实时视频查看.历史视频回放与历史视频下载.在h5已大行其道的当下,基于IE的OCX插件方式已满足不了广大客户的实际需求,因此需要一个兼 ...

  6. 如何利用scrapy新建爬虫项目

    抓取豆瓣top250电影数据,并将数据保存为csv.json和存储到monogo数据库中,目标站点:https://movie.douban.com/top250 一.新建项目 打开cmd命令窗口,输 ...

  7. 企业微信的corpsecret在哪里?

      问题: 查看“企业微信”的官方开发文档,在“获取access_token”部分提到,使用GET请求方法,访问 https://qyapi.weixin.qq.com/cgi-bin/gettoke ...

  8. 1130. Infix Expression (25)

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  9. vue的v-for循环渲染列表时,解决没有:key警告问题(:key的作用)

    :key是为vue的响应式渲染提供方法,在列表中单条数据改变的情况下,可以进行单独渲染,减少页面资源消耗. 当前页面如果有列表渲染v-for,并且在v-for的循环标签中没有:key元素时,控制台会出 ...

  10. 可决系数R^2和方差膨胀因子VIF

    然而很多时候,被筛选的特征在模型上线的预测效果并不理想,究其原因可能是由于特征筛选的偏差. 但还有一个显著的因素,就是选取特征之间之间可能存在高度的多重共线性,导致模型对测试集预测能力不佳. 为了在筛 ...