[CTSC2010]性能优化
循环卷积快速幂
两个注意点:
n+1不是2^k*P+1形式,任意模数又太慢?n=2^k1*3^k2*5^k3*7^k4
多路分治!深刻理解FFT运算本质:分治,推式子得到从下往上的迭代公式
最后求的是w_n^i的点值
快速幂:
循环卷积快速幂比较特殊,就是G*F,>=n的项的系数加到-n位置上
所以,由于w(n,p+n)=w(n,p),点值相乘直接得到G*F的点值表达
F,B点值,快速幂相乘即可
不用把n扩充系数等。
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=5e5+;
int pri[]={,,,};
int n,mod,C;
int G,GI;
int ci[];
int ad(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int dep[],cnt;
void divi(){
int tmp=n;
while(tmp%==) tmp/=,dep[++cnt]=,++ci[];
while(tmp%==) tmp/=,dep[++cnt]=,++ci[];
while(tmp%==) tmp/=,dep[++cnt]=,++ci[];
while(tmp%==) tmp/=,dep[++cnt]=,++ci[];
}
bool che(int x){
for(reg i=;i<;++i){
if(ci[pri[i]]){
if(qm(x,n/pri[i])==) return false;
}
}
return true;
}
void fin(){
G=;
while(!che(G)) ++G;
} int f[N];
int b[N];
int pos[N];
int getpos(int x){
// cout<<" getpos "<<x<<endl;
int len=n,l=;
for(reg i=;i<=cnt;++i){
// cout<<" i "<<i<<" x "<<x<<" ll "<<l<<endl;
int be=(x-l)%dep[i],th=(x-l)/dep[i];
len=len/dep[i];
x=l+len*be+th;
l=x-th;
}
// cout<<" bac "<<x<<endl;
return x;
}
int g[N];
int pw[*N][];
int mem[];
void FFT(int *f,int n,int c){
for(reg i=;i<n;++i) g[i]=f[i];
for(reg i=;i<n;++i) f[pos[i]]=g[i];
int las=;
for(reg i=cnt;i>=;--i){
int p=dep[i];
int st=(mod-)/(las*p);
for(reg l=;l<n;l+=las*p){
for(reg b=;b<las;++b){
for(reg j=;j<p;++j){
mem[j]=;
for(reg i=;i<p;++i){
mem[j]=ad(mem[j],(ll)pw[st*(b+j*las)*i][c]*f[l+b+i*las]%mod);
}
}
for(reg j=;j<p;++j){
f[l+b+j*las]=mem[j];
}
}
}
las*=p;
}
}
int main(){
rd(n);rd(C);mod=n+;
divi();fin();GI=qm(G,mod-);
// cout<<" G "<<G<<" GI "<<GI<<endl;//
pw[][]=pw[][]=;
for(reg i=;i<=*n;++i) pw[i][]=(ll)pw[i-][]*GI%mod,pw[i][]=(ll)pw[i-][]*G%mod;
for(reg i=;i<n;++i) rd(f[i]),f[i]%=mod;
for(reg i=;i<n;++i) rd(b[i]),b[i]%=mod;
for(reg i=;i<n;++i) pos[i]=getpos(i);
// cout<<" pos "<<endl;
// prt(pos,0,n-1);
FFT(f,n,);
// cout<<" ff "<<endl;
// prt(f,0,n-1); FFT(b,n,);
// cout<<" bb "<<endl;
// prt(b,0,n-1); for(reg i=;i<n;++i) f[i]=(ll)f[i]*qm(b[i],C)%mod;
FFT(f,n,);
for(reg i=;i<n;++i){
f[i]=(ll)f[i]*qm(n,mod-)%mod;
printf("%d\n",f[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/19 18:42:47
*/
算是对FFT本质的理解吧。
[CTSC2010]性能优化的更多相关文章
- Luogu4191:[CTSC2010]性能优化
传送门 题目翻译:给定两个 \(n\) 次多项式 \(A,B\) 和一个整数 \(C\),求 \(A\times B^C\) 在模 \(x^n\) 意义下的卷积 显然就是个循环卷积,所以只要代入 \( ...
- Luogu4191 [CTSC2010]性能优化【多项式,循环卷积】
题目描述:设$A,B$为$n-1$次多项式,求$A*B^C$在系数模$n+1$,长度为$n$的循环卷积. 数据范围:$n\leq 5*10^5,C\leq 10^9$,且$n$的质因子不超过7,$n+ ...
- 【Luogu4191】[CTSC2010] 性能优化
题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- JavaScript性能优化
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...
随机推荐
- 5款Python程序员高频使用开发工具推荐
很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...
- 解决 Redis 只读不可写的问题
本文转载:https://blog.csdn.net/han_cui/article/details/54767208?tdsourcetag=s_pcqq_aiomsg 解决 Redis 只读不可写 ...
- Python——线程1
多线程并发 from threading import Thread import time #多线程并发 def func(n): time.sleep(1) print(n) for i in r ...
- Lodop打印连续的纸张
连续的纸张,有时有会被误解为没有高度,高度自适应,其实不是,这属于纸张连续打印,纸张高度和实际单个纸张高度相同.纸张高度自适应适用于没有高度的那种小票打印(卷纸没有纸张分界线),不是这种连续纸张.关于 ...
- vuex2.0 基本使用(1) --- state
Vuex 的核心是 store, 它是一个通过 Vuex.Store 构造函数生成的对象.为什么它会是核心呢?因为我们调用这个构造函数创建store 对象的时候,给它传递参数中包装了state, mu ...
- 常用模块collections
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- Python getattr() 函数
Python getattr() 函数 Python 内置函数 描述 getattr() 函数用于返回一个对象属性值. 语法 getattr 语法: getattr(object, name[, d ...
- Siki的虚幻第一季
空项目.一闪而过的解决方法 命名空间std::cout的作用: int ,long , long long类型的范围 unsigned int 0-4294967295 int 21474 ...
- IntelliJ IDEA default settings 全局默认设置
可以通过以下两个位置设置IDEA的全局默认设置: 以后诸如默认的maven配置就不需要每次都重复配置了?
- Python内建GUI模块Tkinter(二)
Python核心组件 1.Button 按钮组件:一个简单的按钮,用来执行一个命令或别的操作. 参数解析: text:指定按钮上显示的文本: anchor: 指定按钮上文本的位置(N, NE, E, ...