[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 ...
随机推荐
- picker-view 组件 的value失效问题
首先检查是不是漏了绑定关系 组件内 组件引用 如过还不行就用下面的方法,顺序问题 在给暂时列表赋值之后再对value赋值
- hive表链接
等值连接 不等职链接 外部链接 没有包含在聚合函数(这里是count)中的列,都需要包含在group by函数中: 正确的外链接的写法,用的是右外链接: 自链接表 把同一张表 看成了2张表
- python之路--MySQl单表查询
一. 关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...
- 如何通过stat获取目录或文件的权限的数字形式
man stat 查看帮助. -c --format=FORMAT use the specified FORMAT instead of the default; output a new line ...
- vscode git设置
vscode只能打开一下界面: 在setting.path增加git.path选项,再使用linux的方法配置路径,就是使用D:/../bin/git.exe而不是\\ 重启vscode,git设置即 ...
- C#,单元测试
C#,单元测试入门(以下内容可能来自网络) 一.什么叫单元测试(unit testing)? 是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体 ...
- 【Python练习题】程序3
3.题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?x+100 = n*nx+100+168 = m * m 所以(m+n)*(m-n) =168 #题 ...
- python基础数据类型--list列表
列表: 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex ...
- oracle的用户账号密码设置
1. 可以用sqlplus system/你输入的密码 可以用sqlplus /nolog 可以用sqlplus /as sysdba2. @你scott.sql的路径3. 修改你的账号 alter ...
- BZOJ4321queue2——DP/递推
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...