BZOJ 2194 快速傅里叶之二

Posted zhangenming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 2194 快速傅里叶之二相关的知识,希望对你有一定的参考价值。

2194: 快速傅立叶之二

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1471  Solved: 855
[Submit][Status][Discuss]

Description

请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。

Input

第一行一个整数N,接下来N行,第i+2..i+N-1行,每行两个数,依次表示a[i],b[i] (0 < = i < N)。

Output

输出N行,每行一个整数,第i行输出C[i-1]。

Sample Input

5
3 1
2 4
1 1
2 4
1 4

Sample Output

24
12
10
6
1

HINT

Source

和上题一样啊,脑补一下小结论

技术分享图片
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 typedef complex <double> E;
 5 inline int read(){
 6     int x=0;int f=1;char ch=getchar();
 7     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
 8     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
 9     return x*f;
10 }
11 const int MAXN=1e6+10;
12 const double pi=acos(-1);
13 int n,m,R[MAXN],L,H;
14 E a[MAXN],b[MAXN],w[MAXN],k;
15 inline void FFT(E *a,int f){
16     for(int i=0;i<L;i++){
17         if(i<R[i]) swap(a[i],a[R[i]]);
18     }
19         for(int len=2;len<=L;len<<=1){
20             int l=len>>1;
21             E wn(cos(pi/l),f*sin(pi/l));
22             for(int i=1;i<l;i++) w[i]=w[i-1]*wn;
23             for(int st=0;st<L;st+=len){
24                 for(int k=0;k<l;k++){
25                     E x=a[st+k];E y=w[k]*a[st+k+l];
26                     a[st+k]=x+y;a[st+k+l]=x-y;
27                 }
28             }
29         }
30     if(f==-1){
31         for(int i=0;i<L;i++){
32             a[i]/=L;
33         }
34     }
35 }
36 int main(){
37     //freopen("All.in","r",stdin);
38     //freopen("bai.out","w",stdout);
39     n=read();w[0].real()=1;
40     for(int i=0;i<n;i++){
41         a[i]=read();b[n-i-1]=read();
42     }
43     L=1;
44     while(L<2*n) L<<=1,H++;
45     for(int i=0;i<L;i++){
46         R[i]=(R[i>>1]>>1)|((i&1)<<(H-1));
47     }
48     FFT(a,1);FFT(b,1);
49     for(int i=0;i<L;i++) a[i]=a[i]*b[i];
50     FFT(a,-1);
51     for(int i=0;i<n;i++) printf("%d\n",int(a[i+n-1].real()+0.5));
52     return 0;
53 }
View Code
技术分享图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     freopen("All.in","w",stdout);
 5     int n=rand()%10007;int m=rand()%10007;
 6     cout<<n<< <<m<<endl;
 7     for(int i=0;i<n;i++){
 8         printf("%d\n",rand()%17+2);
 9     }
10     for(int i=0;i<m;i++){
11         printf("%d\n",rand()%17+2);
12     }
13     return 0;
14 }
对拍代码

 












以上是关于BZOJ 2194 快速傅里叶之二的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3527: [Zjoi2014]力 [快速傅里叶变换]

BZOJ 2179 [快速傅里叶变换 高精度乘法]

bzoj2179FFT快速傅里叶变换(优化高精度乘法)

快速傅里叶变换

BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]

关于快速傅里叶变换