bzoj2194 快速傅立叶之二 ntt
bzoj2194 快速傅立叶之二
链接
思路
对我这种和式不强的人,直接转二维看。
发现对\(C_k\)贡献的数对(i,j),都是右斜对角线。
既然贡献是对角线,我们可以利用对角线的性质了。
不过右斜角线不太好,我们把每一行都reverse一下,换成左斜角线。
对角线上\(i+j\)相等,可以套上多项式乘法了。
隐藏bug
\(a_i,b_i\)均不大于100,而且数字有1e5个
最大值是1e9,而模数是998244353
应该是可以卡掉模数的,但是不故意卡是不可能爆模数的。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+7,mod=998244353;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,a[N],b[N],limit=1,l,r[N];
int q_pow(int a,int b) {
int ans=1;
while(b) {
if(b&1) ans=1LL*ans*a%mod;
a=1LL*a*a%mod;
b>>=1;
}
return ans;
}
void ntt(int *a,int type) {
for(int i=0;i<=limit;++i)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int mid=1;mid<limit;mid<<=1) {
int Wn=q_pow(3,(mod-1)/(mid<<1));
for(int i=0;i<limit;i+=(mid<<1)) {
for(int j=0,w=1;j<mid;++j,w=1LL*w*Wn%mod) {
int x=a[i+j],y=1LL*w*a[i+j+mid]%mod;
a[i+j]=(x+y)%mod;
a[i+j+mid]=(x+mod-y)%mod;
}
}
}
if(type==-1) {
reverse(&a[1],&a[limit]);
int inv=q_pow(limit,mod-2);
for(int i=0;i<=limit;++i) a[i]=1LL*a[i]*inv%mod;
}
}
int main() {
int n=read()-1;
for(int i=0;i<=n;++i) a[n-i+1]=read(),b[i]=read();
while(limit<=n+n) limit<<=1,l++;
for(int i=0;i<=limit;++i)
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
ntt(a,1),ntt(b,1);
for(int i=0;i<=limit;++i) a[i]=1LL*a[i]*b[i]%mod;
ntt(a,-1);
for(int i=n+1;i>=1;--i) printf("%d\n",a[i]);
return 0;
}
bzoj2194 快速傅立叶之二 ntt的更多相关文章
- BZOJ2194: 快速傅立叶之二(NTT,卷积)
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1776 Solved: 1055[Submit][Status][Discuss] Descript ...
- [bzoj2194]快速傅立叶之二_FFT
快速傅立叶之二 bzoj-2194 题目大意:给定两个长度为$n$的序列$a$和$b$.求$c$序列,其中:$c_i=\sum\limits_{j=i}^{n-1} a_j\times b_{j-i} ...
- BZOJ2194:快速傅立叶之二(FFT)
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
- bzoj2194: 快速傅立叶之二
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- 2018.11.18 bzoj2194: 快速傅立叶之二(fft)
传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...
- bzoj千题计划256:bzoj2194: 快速傅立叶之二
http://www.lydsy.com/JudgeOnline/problem.php?id=2194 相乘两项的下标 的 差相同 那么把某一个反过来就是卷积形式 fft优化 #include< ...
- BZOJ2194 快速傅立叶之二 【fft】
题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 ...
- BZOJ2194: 快速傅立叶之二 FFT_卷积
Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...
- 【BZOJ2194】快速傅立叶之二
[BZOJ2194]快速傅立叶之二 Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. ...
随机推荐
- python-装饰器实现pv-uv
python-装饰器实现pv-uv 网站流量统计可以帮助我们分析网站的访问和广告来访等数据,里面包含很多数据的,比如访问试用的系统,浏览器,ip归属地,访问时间,搜索引擎来源,广告效果等.原来是一 ...
- Jmeter设置默认中文页面
方法一(从网上看到的) 启动Jmeter找到 options >choose language >chinese(简体繁体自己选). 这样设置后界面就变成了中文,但是当我们下次打开时又恢复 ...
- 转载,matla滤波函数
转载地址http://blog.sina.com.cn/s/blog_6163bdeb0102e1dj.html 滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程.滤波器的实现包括滤波器结构的选 ...
- [LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- Nginx配置选项
--prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录.默认使用 /usr/local/nginx. --sbin-path=path 设置nginx的可执行 ...
- Go 初体验 - 并发与锁.2 - sync.WaitGroup
sync包里的WaitGroup主要用于协程同步 计数主协程创建的子线程 WaitGoup.Add(i) 调用清除标记方法WaitGroup.Done() 使用WaitGroup.Wait()来阻塞, ...
- postergresql允许其它主机远程连接
1.pg_hba.conf中添加listen_addresses = '*' #vim /usr/local/postgresql/data/pg_hba.conf #listen_addresses ...
- 关于Win10安装vs2013简体中文语言包无法安装的问题
Win10下安装VS2013后无法安装VS2013中文简体语言包,提示Windows程序兼容模式已打开. 解决方案: 1,随便找个文件夹将简体中文语言包放入其中,发送快捷方式到桌面,右击快捷方式 选择 ...
- 网络-05-端口号-F5-负载均衡设-linux端口详解大全--TCP注册端口号大全备
[root@test1:Standby] config # [root@test1:Standby] config # [root@test1:Standby] config # [root@test ...
- Linq基础+Lambda表达式对数据库的增删改及简单查询
一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net,省去了自己敲代码的实体类和数据访问类的大量工作 实体类: 添加一个Linq to sql 类 --- ...