题目描述:设$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. 学习嵌入式为什么要有uboot(深度解析)

    ref:http://www.elecfans.com/d/617674.html     为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统. 典型的 ...

  2. 其实每个行业都有各自的辛苦,好的程序员并不累,他们乐此不疲(见过太多在职位事业、人生方向上随转如流的人,累了疲乏了就去做别的事情了。必须有自己的坚守和立足的点,自我驱动,否则沦为在别人的体制制度中被驱赶一生)good

    作者:陈柯好链接:https://www.zhihu.com/question/39813913/answer/104275537来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  3. git 去除版本控制

    git会进入当前文件目录, 然后执行如下命令: find . -name ".git" | xargs rm -Rf 该项目就会去除git的版本控制了.再修改的话也不会影响git的 ...

  4. (二)easyUI之消息提示框

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. VBA消息框(MsgBox)(五)

    MsgBox函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击的按钮执行相关的操作. 语法 MsgBox(prompt[,buttons][,title][,helpfile,context ...

  6. ResizeObserver - 元素resize监听API ResizeObserver

    Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addE ...

  7. Personalize Oracle Applications Home Page Browser Window Title

    修改登录页 http://expertoracle.com/2016/03/10/personalizing-the-e-business-suite-r12-login-page/ STEP 2 : ...

  8. 【Zookeeper】实现哨兵机制(选举策略)

    一.Master选举使用场景及结构 二.代码实现 2.1 Maven依赖信息 2.2 IndexController 2.3 MyApplicationRunner 2.4 ElectionMaste ...

  9. Linux学习之六-Linux系统的基础优化

    Linux系统的基础优化 何谓'优化'.顾名思义,优化就是采取某些措施使某个东西或者某事物变得更加优异,出色.对于Linux而言,在初期安装好系统之后,也需要对其进行一定的基础优化,可分为安全上的优化 ...

  10. python-----图片保存为视频

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/2 13:32 # @Author : xiaodai # -*- cod ...