Luogu4191 [CTSC2010]性能优化【多项式,循环卷积】
题目描述:设$A,B$为$n-1$次多项式,求$A*B^C$在系数模$n+1$,长度为$n$的循环卷积。
数据范围:$n\leq 5*10^5,C\leq 10^9$,且$n$的质因子不超过7,$n+1$为质数。
这就是一个循环卷积,在$n=2^k$的情况下可以直接使用FFT/NTT,但是这里不行。
由于$n$的质因子很小,设$n=2^{k_1}*3^{k_2}*5^{k_3}*7^{k_4}$,我们考虑将$n$分治为$p$份(NTT就是$p=2$的情况,这里$p=2,3,5,7$)
$$F(\omega_n^i)=\sum_{i=0}^{p-1}\omega_n^iF_i(\omega_{\frac{n}{p}}^i)$$
设$a_i=F(x)[x^i]$
$$F_r(x)=\sum_{i}a_{ip+r}x^i$$
而$rev$数组其实就是把模$p$同余的放在一起。
NTT的逆变换就是把次数上的$i$改成$-i$,不过代码实现里面我直接写了对$A[1:n-1]$进行reverse(这里说的就是反序)
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = ;
int n, C, mod, pri[N], tot, Wn[N];
inline void add(int &a, int b){a += b; if(a >= mod) a -= mod;}
inline int kasumi(int a, int b){
int res = ;
while(b){
if(b & ) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= ;
}
return res;
}
inline void factor(int n){
for(Rint i = ;i * i <= n;i ++)
if(!(n % i)) pri[++ tot] = i, n /= i, -- i;
if(n > ) pri[++ tot] = n;
}
inline int primitive(){
for(Rint i = ;;i ++){
bool flag = true;
for(Rint j = ;j <= tot && flag;j ++)
if(kasumi(i, n / pri[j]) == ) flag = false;
if(flag) return i;
}
}
int a[N], b[N], tmp[N];
inline void Rev(int *A){
for(Rint i = tot, block = n;i;block /= pri[i], i --){
for(Rint num = , j = ;j < n;j += block)
for(Rint k = ;k < pri[i];k ++)
for(Rint l = ;l < block;l += pri[i])
tmp[num ++] = A[j + k + l];
for(Rint i = ;i < n;i ++) A[i] = tmp[i];
}
}
inline void NTT(int *A, int type){
Rev(A);
for(Rint i = , block = ;i <= tot;i ++){
int mid = block, wi = Wn[n / (block *= pri[i])];
for(Rint j = ;j < n;j ++) tmp[j] = ;
for(Rint j = ;j < n;j += block){
int wk = ;
for(Rint k = ;k < block;k ++){
for(Rint l = k % mid, w = ;l < block;l += mid, w = (LL) w * wk % mod)
add(tmp[j + k], (LL) w * A[j + l] % mod);
wk = (LL) wk * wi % mod;
}
}
for(Rint j = ;j < n;j ++) A[j] = tmp[j];
}
if(type == -){
std :: reverse(A + , A + n);
for(Rint i = ;i < n;i ++)
A[i] = (LL) A[i] * n % mod;
}
}
int main(){
scanf("%d%d", &n, &C); mod = n + ;
for(Rint i = ;i < n;i ++) scanf("%d", a + i);
for(Rint i = ;i < n;i ++) scanf("%d", b + i);
factor(n);
Wn[] = ; Wn[] = primitive();
for(Rint i = ;i <= n;i ++) Wn[i] = (LL) Wn[i - ] * Wn[] % mod;
NTT(a, ); NTT(b, );
for(Rint i = ;i < n;i ++)
a[i] = (LL) a[i] * kasumi(b[i], C) % mod;
NTT(a, -);
for(Rint i = ;i < n;i ++)
printf("%d\n", a[i]);
}
Luogu4191
Luogu4191 [CTSC2010]性能优化【多项式,循环卷积】的更多相关文章
- [CTSC2010]性能优化
[CTSC2010]性能优化 循环卷积快速幂 两个注意点:n+1不是2^k*P+1形式,任意模数又太慢?n=2^k1*3^k2*5^k3*7^k4 多路分治!深刻理解FFT运算本质:分治,推式子得到从 ...
- 【Luogu4191】[CTSC2010] 性能优化
题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...
- Luogu4191:[CTSC2010]性能优化
传送门 题目翻译:给定两个 \(n\) 次多项式 \(A,B\) 和一个整数 \(C\),求 \(A\times B^C\) 在模 \(x^n\) 意义下的卷积 显然就是个循环卷积,所以只要代入 \( ...
- 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 ...
随机推荐
- Ubuntu Server 18.04 无法修改 hostname
对于运维而言,我们希望每台服务器的 hostname 都能体现出它自己的功能/ip,方便排查. ubuntu server live 18.04 的安装流程非常友好,从 ip 到 hostname 都 ...
- CAS 5.x搭建常见问题系列(3).Failure to find org.apereo.cas:cas-server-support-pm-jdbc:jar:5.1.9
错误内容 cas overlay的pom.xml增加了cas-server-support-pm-jdbc.jary依赖后, 打包(mvn package)出现如下的报错 D:\casoverlay\ ...
- (八)mybatis之多对多
一.需求分析 需求:查询所有用户的信息以及每个用户所属的组的信息 分析:一个用户可以有多个组,一个组也可以由多个用户. 多对多,可以设置一张中间表,该表存放的是用户表和组表的对应关系. 二.创建数据库 ...
- IdentityServer4密码模式接入现有用户数据表
具体接入identityserver请看文档,这里只简单列举部分步骤 1.创建一个web项目,引入Identityserver4的nuget包 2.新建一个类,实现IResourceOwnerPass ...
- 微软升级 WSL Window Subsystem for Linux Win10系统自带Linux
在设计之初,微软就允许类似于Win32这种子系统运行于windows NT内核之上,它可以为上层应用提供编程接口,同时避免应用去实现内核里的一些调用细节.NT内核的设计在最开始就可以支持POSIX,O ...
- 重装win7后如何恢复ubuntu引导
在重装系统之后,开机启动界面的ubuntu引导不见了,直接进入新安装的window系统中.下面是如何恢复ubuntu引导的方法: 1)准备一张ubuntu系统安装盘: 2)将ubuntu系统安装盘放入 ...
- 使用zrender.js绘制体温单(1)
之前公司请外包做了一个体温单使用的zrender.js 但是代码比较复杂维护性比较低再加上自己技术也不行 最近闲下来的时候看了一下zrender的官网慢慢的摸索并读了下之前的代码,感觉实际并不难,就自 ...
- ES6 class 于 继承 extends
之前构造函数,没有类的概念,ES6中有了class类这个东西. 简单的一个例子: 输出: 需要注意的是,语法换了,但是构造函数.构造函数的原型.实例的关系还是那样. 输出: 需要注意写法: 底层还是p ...
- svm 简单明了的入门级使用教程(转载)
如何使用libsvm进行分类 这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述. 其实使用libsvm进行分类很 ...
- Flutter——BottomNavigationBar组件(底部导航栏组件)
BottomNavigationBar常用的属性: 属性名 说明 items List<BottomNavigationBarItem> 底部导航条按钮集合 iconSize icon c ...