[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 ...
随机推荐
- vue-axios的application/x-www-form-urlencod的post请求无法解析参数
vue-axios的post会先将对象转为json然后再根据headers的设置再转一次格式,可以将参数先用qs.stringify()转一次再传输
- jquery选择基础
1 元素选择器 之前不熟悉的是如: $("input.cls1"); 这种用法 2 属性选择器 包含name属性的input元素, 如 $("input[name]&qu ...
- scala下划线
作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...
- Java中Optional类的使用
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- python设计模式第十九天【职责链模式】
1.应用场景 (1)将一个任务拆分为具有顺序的多个部分,每个类完成相应的部分,并且顺序执行 (2)软件窗口的消息传播 (3)SERVLET容积的过滤器Filter的实现 2.代码实现 #!/usr/b ...
- idea创建maven项目的一点关键
maven中的一些概念: POM:项目对象模型(Project Object Model),是项目的一些关键元信息的集合.主要包含项目管理信息.具体的项目描述.开发小组的构 成.源代码库(如CVS)和 ...
- Hibernate最佳实战
1:一对一,一对多,多对多双向管理必设mappedBy ,将关系交给乙方维护,不然的话会在双方都建立关系,比如一对一双向的时候双方都会保存对方的id外键管理 具体在项目中采用双向还是单项看实际情况. ...
- Codeforces#543 div2 B. Mike and Children(暴力?)
题目链接:http://codeforces.com/problemset/problem/1121/B 题意 给n个数 最多的对数 其中每一对(i,j)的ai+aj都相等(不知道怎么解释.... 判 ...
- 思路:当一个表嵌套另一个表时候 只需在dao中引入该mapper即可 进行正常的数据插入 查询 修改等
- Web.xml中Filter过滤器标签几个说明
在研究liferay框架中看到Web.xml中加入了过滤器的标签,可以根据页面提交的URL地址进行过滤,发现有几个新标签没用过,下面就介绍以下几个过滤器的标签用法: <!-- 定义Filter ...