hdu 4656 Evaluation [任意模数fft trick]
hdu 4656 Evaluation
题意:给出\(n,b,c,d,f(x) = \sum_{i=1}^{n-1} a_ix^i\),求\(f(b\cdot c^{2k}+d):0\le k < n\)
取模\(10^6+3\)
昨天刚看过《具体数学》上求和一章
代入\(b\cdot c^{2k}+d\)然后展开,交换求和顺序,得到
\]
后面的式子反转后变成卷积,fft预处理\(p_j = \sum_{i=j}^n a_i i! \frac{d^{i-j}}{(i-j)!}\)
那么我们要求
\]
到这里就不会了,看了叉姐的课件,很神的一步来转化成卷积
\]
代入之后得到
\]
再次fft就行了
注意,指数带着平方可以为负,所以我们先乘上\(x^n\)
然后还要用拆系数fft.... 完虐ntt怒拿rank1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long ll;
const int N = (1<<18) + 5, mo = 1e6+3, P = 1e6+3;
const double PI = acos(-1.0);
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
struct meow{
double x, y;
meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;
namespace fft {
int maxlen, rev[N];
cd omega[N], omegaInv[N];
void init(int lim) {
maxlen = 1; while(maxlen < lim) maxlen<<=1;
for(int i=0; i<maxlen; i++) {
omega[i] = cd(cos(2*PI/maxlen*i), sin(2*PI/maxlen*i));
omegaInv[i] = conj(omega[i]);
}
}
void dft(cd *a, int n, int flag) {
cd *w = flag == 1 ? omega : omegaInv;
int k = 0; while((1<<k) < n) k++;
for(int i=0; i<n; i++) {
rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));
if(i < rev[i]) swap(a[i], a[rev[i]]);
}
for(int l=2; l<=n; l<<=1) {
int m = l>>1;
for(cd *p = a; p != a+n; p += l)
for(int k=0; k<m; k++) {
cd t = w[maxlen/l*k] * p[k+m];
p[k+m] = p[k] - t;
p[k] = p[k] + t;
}
}
if(flag == -1) for(int i=0; i<n; i++) a[i].x /= n;
}
cd a[N], b[N], c[N], d[N];
void mul_any(int *x, int *y, int lim) {
int n = maxlen;
for(int i=0; i<lim; i++) {
a[i] = cd(x[i]>>15), b[i] = cd(x[i]&32767);
c[i] = cd(y[i]>>15), d[i] = cd(y[i]&32767);
}
for(int i=lim; i<n; i++) a[i] = b[i] = c[i] = d[i] = cd();
dft(a, n, 1); dft(b, n, 1); dft(c, n, 1); dft(d, n, 1);
for(int i=0; i<n; i++) {
cd _a = a[i], _b = b[i], _c = c[i], _d = d[i];
a[i] = _a * _c;
b[i] = _a * _d + _b * _c;
c[i] = _b * _d;
}
dft(a, n, -1); dft(b, n, -1); dft(c, n, -1);
for(int i=0; i<lim; i++) x[i] = ( (ll(a[i].x + 0.5) %mo <<30) + (ll(b[i].x + 0.5) %mo <<15) + ll(c[i].x + 0.5)%mo) %mo;
}
}
inline ll Pow(ll a, int b) {
ll ans = 1;
for(; b; b>>=1, a=a*a%P)
if(b&1) ans=ans*a%P;
return ans;
}
int n, a[N], b, c, d, p[N], g[N], f[N], c2[N];
ll inv[N], fac[N], facInv[N];
int main() {
freopen("in", "r", stdin);
n=read(); b=read(); c=read(); d=read();
for(int i=0; i<n; i++) a[i] = read();
fft::init(n+n+1);
inv[1] = fac[0] = facInv[0] = 1;
for(int i=1; i<=n; i++) {
if(i != 1) inv[i] = (P-P/i) * inv[P%i] %P;
fac[i] = fac[i-1] * i %P;
facInv[i] = facInv[i-1] * inv[i] %P;
}
ll mi = 1;
for(int i=0; i<=n; i++, mi = mi * d %P) p[i] = a[n-i] * fac[n-i] %P, g[i] = mi * facInv[i] %P;
fft::mul_any(p, g, n+1);
for(int i=0; i<=n>>1; i++) swap(p[i], p[n-i]);
mi = 1;
memset(g, 0, sizeof(g));
for(int i=0; i<=n; i++, mi = mi * b %P) {
int t = Pow(c, (ll) i * i %(P-1));
f[i] = mi * t %P * p[i] %P * facInv[i] %P;
if(i != n) g[i + n] = g[n - i] = Pow(t, P-2);
//if(i != n) g[i + n-1] = g[n-1 - i] = Pow(t, P-2);
c2[i] = t;
}
fft::mul_any(f, g, n+n+1);
for(int i=0; i<n; i++) f[i+n] = (ll) f[i+n] * c2[i] %P, printf("%d\n", f[i+n]);
//for(int i=0; i<n; i++) f[i+n-1] = (ll) f[i+n-1] * c2[i] %P, printf("%d\n", f[i+n-1]);
}
hdu 4656 Evaluation [任意模数fft trick]的更多相关文章
- 【集训队作业2018】取名字太难了 任意模数FFT
题目大意 求多项式 \(\prod_{i=1}^n(x+i)\) 的系数在模 \(p\) 意义下的分布,对 \(998244353\) 取模. \(p\) 为质数. \(n\leq {10}^{18} ...
- 51nod 1172 Partial Sums V2 卡精度的任意模数FFT
卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数f ...
- 任意模数FFT
任意模数FFT 这是一个神奇的魔法,但是和往常一样,在这之前,先 \(\texttt{orz}\ \color{orange}{\texttt{matthew99}}\) 问题描述 给定 2 个多项式 ...
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...
- 拆系数FFT(任意模数FFT)
拆系数FFT 对于任意模数 \(mod\) 设\(m=\sqrt {mod}\) 把多项式\(A(x)\)和\(B(x)\)的系数都拆成\(a\times m+b\)的形式,时\(a, b\)都小于\ ...
- HDU 4656 Evaluation(MTT)
题意 \(x_k=bc^{2k}+d\) \(\displaystyle F(x)=\sum_{i=0}^{n-1}a_ix^i\) 给定 \(\{a\},b,c,d,n\) ,求 \(F(x_0), ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 任意模数NTT
任意模数\(NTT\) 众所周知,为了满足单位根的性质,\(NTT\)需要质数模数,而且需要能写成\(a2^{k} + r\)且\(2^k \ge n\) 比较常用的有\(998244353,1004 ...
- 【模板】任意模数NTT
题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...
随机推荐
- hdu_1036(取整和格式控制)
题意很简单,求平均时间 复习一下如何取整 (int) fl 是直接向下取整 == floor(fl) 向上取整 (int)(fl+1) == ceil(fl) 四舍五入 (int)(fl+0.5 ...
- ubuntu配置服务器apache
在配置apache之前我们需要先配置好ubuntu中的网络,如果不太懂的话可以看看这我的这篇文章:配置ubuntu网络,里面详细的介绍了怎么配置ubuntu的网络. 1.安装apache服务器 sud ...
- [学习OpenCV攻略][006][平滑图片]
cvCreateImage(图片大小,像素位数,通道数) 创建图片,根据输入的图片大小,各个通道像素点的位数,和通道数.像素点宏IPL_DEPTH_8U cvGetSize(图片) 得到图片的大小信息 ...
- 最小生成数之Kruskal算法
描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成 ...
- Android开发之漫漫长途 XII——Fragment详解
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 全栈开发之HTML快速入门(一)
一.HTML 是什么? HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (markup language) 标记 ...
- jQuery中foreach的continue和break
摘录自:http://blog.csdn.net/penginpha/article/details/12159389 1. continue. 可以使用return. $("***&quo ...
- python_如何定义带参数的装饰器?
案例: 实现一个装饰器,用它来检查被装饰函数的参数类型. 需求: 装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常 如何解决这个问题? 先要获取函数的签名, ...
- java项目导出war包
@参考文档 假如项目名称为yanan,进入到yanan目录下打开cmd 执行:jar -cvf yanan.war ./* 命令详解: @参考文档1 @参考文档2 jar:jar工具是个java应用程 ...
- logback使用配置详解
title: logback使用配置详解 date: 2017-04-25 16:42:49 tags: 日志 --- 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为 ...