HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3
每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- -
/*
HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Training Contest 3
题意:
给定多项式 F(x) = ∑[0<=i<=n] f(i)*x^i
求多项式 G(x) = F(x-a)
n <= 1e5
分析:
设 G(x) = ∑ g(i)*x^i
将 F(x-a) 按二项式定理展开后易得:
g(x) = ∑[x<=y<=n] Comb(y,x) * f(y) * (-a)^(y-x)
打开组合数,移项:
g(x)*x! = ∑[x<=y<=n] f(y)*y! * (-a)^(y-x) / (y-x)!
设 g'(x) = g(x)*x!
p(x) = f(y)*y!
q(x) = (-a)^x/x!
则 g'(x) = ∑[x<=y<=n] p(y) * q(y-x)
= ∑[1<=y<=n-x] p(y+x) * q(y)
设 g''(x) = g'(n-x)
则 g''(x) = ∑[1<=y<=x] p(n-(x-y)) * q(y)
设 p'(x) = p(n-x)
则 g''(x) = ∑[1<=y<=x] p'(x-y) * q(y)
算出这个卷积后回带即可
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e5+5;
const LL MOD = 998244353;
namespace NTT {
const int G = 3;
const int NUM = 20;
LL wn[20];
LL mul(LL x, LL y) {
return x*y% MOD;
}
LL PowMod(LL a, LL b) {
LL res = 1;
a %= MOD;
while (b) {
if (b&1) res = mul(res, a);
a = mul(a, a);
b >>= 1;
}
return res;
}
void Init() { for (int i = 0; i < NUM; i++)
{
int t = 1<<i;
wn[i] = PowMod(G, (MOD-1)/t);
}
}
void Change(LL a[], int len)
{
int i, j, k;
for (i = 1, j = len/2; i < len-1; i++)
{
if (i < j) swap(a[i], a[j]);
k = len/2;
while (j >= k) {
j -= k;
k /= 2;
}
if (j < k) j += k;
}
}
void NTT(LL a[], int len, int on)
{
Change(a, len);
int id = 0;
for (int h = 2; h <= len; h <<= 1)
{
id++;
for (int j = 0; j < len; j += h)
{
LL w = 1;
for (int k = j; k < j + h/2; k++)
{
LL u = a[k] % MOD;
LL t = mul(a[k+h/2], w);
a[k] = (u+t) % MOD;
a[k+h/2] = ((u-t)% MOD + MOD ) % MOD;
w = mul(w, wn[id]);
}
}
}
if (on == -1) {
for (int i = 1; i < len/2; i++)
swap(a[i], a[len-i]);
LL inv = PowMod(len, MOD-2);
for (int i = 0; i < len; i++)
a[i] = mul(a[i], inv);
}
}
void solve(LL a[], int n, LL b[], int m)
{
int len = 1;
while (len < n*2 || len < m*2) len <<= 1;
for (int i = n; i < len; i++) a[i] = 0;
for (int i = m; i < len; i++) b[i] = 0;
NTT(a, len, 1);
NTT(b, len, 1);
for (int i = 0; i < len; i++) a[i] = mul(a[i], b[i]);
NTT(a, len, -1);
}
}
LL f[N], p[N<<3], q[N<<3];
LL a;
int n, m;
LL F[N], Finv[N], inv[N];
void init(){
inv[1] = 1;
for (int i = 2; i < N; i++) {
inv[i] = (MOD-MOD/i) * inv[MOD%i] % MOD;
}
F[0] = Finv[0] = 1;
for (int i = 1; i < N; i++){
F[i] = F[i-1] * i % MOD;
Finv[i] = Finv[i-1] * inv[i] % MOD;
}
}
void solve()
{
for (int i = 0; i <= n; i++)
p[i] = F[i] * f[i] % MOD;//p(x)
q[0] = 1;
for (int i = 1; i <= n; i++)
q[i] = q[i-1] * (MOD-a) % MOD * inv[i] % MOD;//q(x)
for (int i = 0; i <= n/2; i++)
swap(p[i], p[n-i]);//p'(x)
NTT::solve(p, n+1, q, n+1);//g''(x)
for (int i = 0; i <= n/2; i++)
swap(p[i], p[n-i]);//g'(x)
for (int i = 0; i <= n; i++)
p[i] = p[i] * Finv[i] % MOD;//g(x)
}
int main()
{
init();
NTT::Init();
while (~scanf("%d", &n))
{
for (int i = 0; i <= n; i++) scanf("%lld", &f[i]);
scanf("%d", &m);
a = 0;
for (int i = 1; i <= m; i++)
{
LL x; scanf("%lld", &x);
a = (a+x) % MOD;
}
solve();
for (int i = 0; i <= n; i++) printf("%lld ", p[i]);
puts("");
}
}
HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3的更多相关文章
- 2017 多校3 hdu 6061 RXD and functions
2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...
- HDU 6061 RXD and functions NTT
RXD and functions Problem Description RXD has a polynomial function f(x), f(x)=∑ni=0cixiRXD has a tr ...
- HDU 6061 RXD and functions(NTT)
题意 给定一个\(n\) 次的 \(f\) 函数,向右移动 \(m\) 次得到 \(g\) 函数,第 \(i\) 次移动长度是 \(a_i\) ,求 \(g\) 函数解析式的各项系数,对 ...
- HDU 6061 RXD and functions
题目链接:HDU-6061 题意:给定f(x),求f(x-A)各项系数. 思路:推导公式有如下结论: 然后用NTT解决即可. 代码: #include <set> #include < ...
- HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3
/* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...
- HDU 6063 - RXD and math | 2017 Multi-University Training Contest 3
比赛时候面向过题队伍数目 打表- - 看了题解发现确实是这么回事,分析能力太差.. /* HDU 6063 - RXD and math [ 数学,规律 ] | 2017 Multi-Universi ...
- HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9
/* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
随机推荐
- *#【Python】【基础知识】【运算符】【Python的几类运算符】
Python的运算符分为以下几类: 算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 以及需要考虑的:运算符优先级 一.算术运算符: 需要注意的,上图是Python 2.0 ...
- 【转】mysql分库分表,数据库分库分表思路
原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路 一. 数据切分 关系型数 ...
- hanlp分词工具应用案例:商品图自动推荐功能的应用
本篇分享一个hanlp分词工具应用的案例,简单来说就是做一图库,让商家轻松方便的配置商品的图片,最好是可以一键完成配置的. 先看一下效果图吧: 商品单个推荐效果:匹配度高的放在最前面 这个想法很好,那 ...
- Django-报错信息及admin后台汉化
django-admin 汉化 效果对比 django admin 后台 报错信息 配置 修改配置文件中的 LANGUAGE_CODE 与 TIME_ZONE 即可. 将 django admin 后 ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...
- Jmeter4.0---- jmeter中写入java代码_简单了解(15)
1.说明 BeanShell:是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命令.闭包等通用脚本 ...
- windows服务与log4net应用
有时候我们需要用到window服务来执行定时任务,然后配合log4net记录程序运行情况,这里简单记录下配置的整个过程以及注意要点: 一.添加windows服务 1.设计页面,右键添加安装程序
- VS多行注释快捷键
VS多行注释快捷键 注释:Ctrl+K,Ctrl+C 取消注释:Ctrl+K,Ctrl+U
- luogu题解 P3629 【[APIO2010]巡逻】树的直径变式
题目链接: https://www.luogu.org/problemnew/show/P3629 分析 最近被众多dalao暴虐,这道题傻逼地调了两天才知道错哪 不过这题比较良心给你一个容易发现性质 ...
- 操作系统中堆(heap)与栈(stack)的区别
主要区别如下: 一.空间分配: 1.堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表.PS:java中都是系统GC,程序员无法进行GC. 2.栈(操作 ...