题目描述:设$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]性能优化【多项式,循环卷积】的更多相关文章

  1. [CTSC2010]性能优化

    [CTSC2010]性能优化 循环卷积快速幂 两个注意点:n+1不是2^k*P+1形式,任意模数又太慢?n=2^k1*3^k2*5^k3*7^k4 多路分治!深刻理解FFT运算本质:分治,推式子得到从 ...

  2. 【Luogu4191】[CTSC2010] 性能优化

    题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...

  3. Luogu4191:[CTSC2010]性能优化

    传送门 题目翻译:给定两个 \(n\) 次多项式 \(A,B\) 和一个整数 \(C\),求 \(A\times B^C\) 在模 \(x^n\) 意义下的卷积 显然就是个循环卷积,所以只要代入 \( ...

  4. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  5. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  6. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  7. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  8. C#中那些[举手之劳]的性能优化

    隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...

  9. JavaScript性能优化

    如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...

随机推荐

  1. 编写并提取通用 ShellCode

    简易 ShellCode 虽然可以正常被执行,但是还存在很多的问题,因为上次所编写的 ShellCode 采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统一 ...

  2. Luogu4022 CTSC2012熟悉的文章(广义后缀自动机+二分答案+动态规划+单调队列)

    对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&am ...

  3. 开发人员需求能kill杀死其它阻塞自己的会话,测试发现需要alter system权限有风险

    模拟开发人员需求,可以杀死其它阻塞自己的会话1.能有查询阻塞会话确认的权限SQL> grant select on v_$session to testa;SQL> grant selec ...

  4. (七)Redis之持久化之RDB方式

    一.持久化概念 所有的数据都存在内存中,从内存当中同步到硬盘上,这个过程叫做持久化过程. 使用方法: 1. rdb持久化方法:在指定的时间间隔写入硬盘 2.         aof方式:将以日志,记录 ...

  5. node 和 postgres

    安装 npm i pg ,如果慢的话,记得爬梯子 连接池的方式: var pg = require('pg'); // 数据库配置 var config = { user:"postgres ...

  6. WebApi 全局异常与局部异常

    全局异常过滤器 public class ApiExceptionFilter:ExceptionFilterAttribute { private IHostingEnvironment _env; ...

  7. 减少打包组件vue.config.js——Webpack的externals的使用

    vue.config.js module.exports = { configureWebpack:{ externals: { vue: 'Vue', 'vue-router':'VueRouter ...

  8. 在nuxt项目中使用component组件

    编写组件页面 1.在components下新建一个新建组件页面,如下所示 2.新建完成之后初始页面的代码如下所示: 3.下面从element-ui上找一个顶部导航菜单写到组件页面. <el-me ...

  9. 如何在SAP Kyma的控制台里扩展新的UI

    方法是创建一个新的resource,类型为ClusterMicroFrontend. 使用命令行kubectl get ClusterMicroFrontend查看这些UI扩展: 最后自定义的UI出现 ...

  10. 前端(HTML)+后端(Django)+数据库(MySQL):用户注册及登录演示

    1.创建一个html文件用于简单的网页注册demo <!DOCTYPE html> <html lang="en"> <head> <me ...