题目描述:设$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. 字符串的简单操作----记录次数 hdu2617

    统计出字符串中共能拼凑出多少happy.happy相对次序不变. #include<cstdio> #include<iostream> #include<string. ...

  2. .NetCore如何使用ImageSharp进行图片的生成

    ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形.验证码等方式进行探讨和实践. 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片, ...

  3. 再谈.NET委托(delegate、Func<>)

    为了演示委托,我们先来定义一个方法:public static bool IsTen(int i){    return i == 10 ? true : false;} 如果要用自定义委托,则需要声 ...

  4. 题解 P3378 【【模板】堆】

    Update 18.2.27----想当年我还用着C..... 看到题解里一堆用C++ STL库中的优先队列,身为C语言选手心里不是滋味 故手打一个优先队列献给坚守在C语言的选手 #include & ...

  5. vue-cli3 使用雪碧图

    //vue.config.js const path = require("path"); const SpritesmithPlugin = require("webp ...

  6. js 五 jquery的使用,调用

    4 this 关键字 this 表示当前函数或方法的调用者 1 全局函数由window调用,所以全局函数中的this 指的是window对象 2 事件处理函数中使用this,指的是当前事件的触发对象 ...

  7. MyBaties --day1

    今天就来聊聊这个东西 今天的主角相信大家也看到了 MyBaties  是个什么东东 它有什么作用?怎么用?好不好用今天来说说 .说到MyBaties 就不得不谈到JDBC大家可能都知道 JDBC用来操 ...

  8. Linux服务器TIME_WAIT进程的解决与原因

    linux服务器上tcp有大量time_wait状态的解决方法和原因解释 毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态,TIME_WAIT状态存在于主动关闭socket连接 ...

  9. FreeRTOS编程风格

    数据类型 基本使用的是标准C里面的数据类型,但是针对不同的处理器,对标准C的数据类型又进行了重定义: 在FreeRTOS中详细的数据类型重定义在portmacro.h这个文件中,具体如下: /* Ty ...

  10. python3 pyinstaller

    一.安装python.pywin32.pyinstaller库 二.官网:https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html#general ...