2017 多校3 hdu 6061 RXD and functions(FFT)

题意:

给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\)

求\(g(x) = f(x - \sum a_i)\)后每一项\(x^{i}\)的系数mod998244353

\(n <= 10^{5},m <= 10^{5}\)

\(0 <= c_i < 998244353\)

\(0 <= a_i < 998244353\)

思路:

令\(d = -\sum a_i\),把\(g(x)\)展开得:

\[g(x) = c_0 (x + d)^{0} + c_1 (x + d)^{1} + ... + c_n (x+d)^{n}
\]

令\(a_i = d^{i}\),再用二项式定理化简一下可以得到

\[g(x) = \sum_{i = 0}^{n}x^{i}\sum_{k=i}^{n}C(k,i)c_ka_{k-i}
\]

\(fft\)只是入了门,想了半天,看不出来这是个卷积式子,组合数会变化啊,赛后终于开窍组合数是个阶乘啊,把\(c_k 和 a^{k-i}变换一下\)

令$$b_k = c_k \cdot k!, a_i = \frac{a_i}{i!}$$

\(g(x)\)就可以写成

\[g(x) = \sum_{i = 0}^{n}x^{i} \cdot \frac{1}{i!}\sum_{k=i}^{n}b_ka_{k-i}
\]

令\(ans(i) = \frac{1}{i!} \sum_{k=i}^{n}b_ka_{k-i}\)

把b数组逆序一下

\(ans(i) = \frac{1}{i!}\sum_{k=0}^{n-i}b_{k}a_{n-k-i}\)

类比fft多项式乘法下面\(c_j\)的形式 \(\sum_{k=0}^{n-i}b_{k}a_{n-k-i}\)这一项其实就是\(fft\)之后得到的数组\(c_{n-i}\),最后答案\(ans(i) = \frac{1}{i!} c_{n-i}\)

\(A(x) = \sum_{i=0}^{n}a_ix^{i}\)

\(B(x) = \sum_{i=0}^{n}b_ix^{i}\)

\(C(x) = A(x)B(x) = \sum_{i=0}^{2n}c_ix^{i}\)

\(c_j = \sum_{i=0}^{j}a_ib_{j-i}\)

然后就上板子了,由于是在模意义下的运算,要拿ntt,去找了个板子

不太会用啊,板子上的费马素数是P=(1LL<<55) * 5+1,原根g=6的,

开始交了几发,TLE,原来是数组开小了,改完再交RE了,也不知道改了哪里就没RE了,然后WA了,暴力对拍数据,发现是费马素数的锅,乱试了其他的一些费马素数,又想了半天觉得这样不行,本来就是在mod下取的逆元,又在P下做运算,ntt原理也不懂,一脸懵逼,最后我直接把P改成mod试了一下,居然A了,好像给的这个mod本来是就是一个费马素数(1<<23) * 119 + 1,g = 3,而且运气好前面试的费马素数原根刚好是3。

还有疑问就是运算时费马素数应该取多大呢,==再深入学习一下

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 1000;
const int mod = 998244353;
const LL P = mod;
const LL G = 3;
const int NUM = 23;
int read(){
int x = 0;
char c;
while((c=getchar())<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+(c-'0'), c=getchar();
return x;
}
int fac[N],facinv[N];
int n, m;
LL mul(LL x,LL y){
//return (x * y - (LL)(x / (long double)P * y + 1e-3) * P + P) % P;
return x * y % P;
}
LL q_pow(LL a,LL b){
LL res = 1,tmp = a;
while(b){
if(b &1) res = res * tmp % P;
tmp = tmp * tmp % P;
b >>= 1;
}
return res;
}
void init(){
fac[0] = facinv[0] = 1;
for(int i = 1;i < N;i++){
fac[i] = 1LL * i * fac[i-1] % mod;
facinv[i] = 1LL * q_pow(i, mod - 2) * facinv[i - 1] % mod;
}
}
LL wn[NUM];
LL a[2 * N], b[2 * N],c[N];
void GetWn()
{
for(int i = 0; i< NUM; i++)
{
int t = 1 << i;
wn[i] = q_pow(G, (P - 1) / t);
}
}
void Rader(LL a[], int len)
{
int j = len >> 1;
for(int i=1; i<len-1; i++)
{
if(i < j) swap(a[i], a[j]);
int k = len >> 1;
while(j >= k)
{
j -= k;
k >>= 1;
}
if(j < k) j += k;
}
}
void NTT(LL a[], int len, int on)
{
Rader(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];
LL t = mul(w,a[k + h / 2]);
a[k] = (u + t) % P;
a[k + h / 2] = ((u - t) % P + P) % P;
w = mul(w,wn[id]);
}
}
}
if(on == -1)
{
for(int i = 1; i < len / 2; i++)
swap(a[i], a[len - i]);
LL Inv = q_pow(len, P - 2);
for(int i = 0; i < len; i++)
a[i] = mul(a[i],Inv);
}
}
void Conv(LL a[], LL b[], int n)
{
NTT(a, n, 1);
NTT(b, n, 1);
for(int i = 0; i < n; i++) a[i] = mul(a[i],b[i]);
NTT(a, n, -1);
}
int main()
{
GetWn();
init();
while(scanf("%d",&n) == 1){
for(int i = 0;i <= n;i++) c[i] = read();
int sum = 0;
m = read();
for(int i = 1;i <= m;i++){
int x;
x = read();
sum = (sum - x + mod) % mod;
}
int len = 1;
while(len < 2 * (n + 1)) len <<= 1;
int res = 1;
for(int i = 0;i <= n;i++) {
a[i] = 1LL * res * facinv[i] % mod, res = 1LL * res * sum % mod;
b[i] = c[n - i] * fac[n - i] % mod;
}
for(int i = n + 1;i < len;i++) a[i] = b[i] = 0;
Conv(a,b,len);
for(int i = 0;i <= n;i++) printf("%lld ",a[n - i] * facinv[i] % mod);
printf("\n");
}
return 0;
}

2017 多校3 hdu 6061 RXD and functions的更多相关文章

  1. HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3

    每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- - /* HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Tr ...

  2. 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 ...

  3. HDU 6061 RXD and functions(NTT)

    题意 给定一个\(n​\) 次的 \(f​\) 函数,向右移动 \(m​\) 次得到 \(g​\) 函数,第 \(i​\) 次移动长度是 \(a_i​\) ,求 \(g​\) 函数解析式的各项系数,对 ...

  4. HDU 6061 RXD and functions

    题目链接:HDU-6061 题意:给定f(x),求f(x-A)各项系数. 思路:推导公式有如下结论: 然后用NTT解决即可. 代码: #include <set> #include < ...

  5. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  6. 2017 多校5 hdu 6093 Rikka with Number

    2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...

  7. 2017 Multi-University Training Contest - Team 3 RXD and functions(NTT)

    题解: 我是参考的 http://blog.csdn.net/qq_32570675/article/details/76571666 这一篇 orz 原来可以这么变换,涨姿势 代码: #includ ...

  8. HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3

    /* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...

  9. HDU 6063 - RXD and math | 2017 Multi-University Training Contest 3

    比赛时候面向过题队伍数目 打表- - 看了题解发现确实是这么回事,分析能力太差.. /* HDU 6063 - RXD and math [ 数学,规律 ] | 2017 Multi-Universi ...

随机推荐

  1. 解决 div或者a标签的高度比里面的img高度多的 问题

    今天做练习遇到一个问题,分享一下解决办法: 在编写html中的一个放置图片时,代码如下: <div class="nrtp"> <div class=" ...

  2. ORM初级实战简单的数据库交互

    setting.py中: """ Django settings for untitled3 project. Generated by 'django-admin st ...

  3. 多任务版udp聊天器

    import socket import threading def send_msg(udp_socket): """获取键盘数据,并将其发送给对方"&quo ...

  4. 复用传统C/S架构系统,升级成‘伪’B/S架构设计

    应用场景:已经部署了传统系统又想要移动方式的场景.安全性考虑要求高的场景(核心资源要求在企业内部的场景). 我们 做了如下的系统设计: 核心是我们利用了WS做了内外穿透的设计.

  5. Spring Security 简介

    本文引自:https://blog.csdn.net/xlecho/article/details/80026527 在 Web 应用开发中,安全一直是非常重要的一个方面.安全虽然属于应用的非功能性需 ...

  6. java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗?

    问.java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗? 答:没有区别,jdk5 和 jdk1.5 所代表的意思是一样的,只是叫法不一样 关键字: jdk5 j ...

  7. Shell学习——数值运算

    在Bash shell中,可以利用let.(( )).[]执行基本的算术操作,在高级操作时,使用expr和bc两个工具1.let[root@client02 ~]# no1=4[root@client ...

  8. scrapy--Beautyleg

    很早就开始关注:Beautyleg 高清丝袜美腿.关注之后开始觉得打开了新世界的大门,如果有相同观点的,那么你很有品味.说真的,学习爬虫的动力之一就是想把里面的图片爬取下来.哈哈哈!!! 给大家放点爬 ...

  9. Manacher算法:求解最长回文字符串,时间复杂度为O(N)

    原文转载自:http://blog.csdn.net/yzl_rex/article/details/7908259 回文串定义:"回文串"是一个正读和反读都一样的字符串,比如&q ...

  10. 【PHP项目】伪静态规则

    伪静态规则写法RewriteRule-htaccess详细语法使用 2016年03月30日 16:53:59 阅读数:20340 伪静态实际上是利用php把当前地址解析成另一种方法来访问网站,要学伪静 ...