BZOJ2194: 快速傅立叶之二

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2194

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

题解:这就是所谓的卷积,找个时间一定要好好看看,上FFT咯

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<cmath>
 6 #define maxn 270005
 7 #define pi acos(-1)
 8 using namespace std;
 9 int n,m;
10 int ans[maxn],rev[maxn];
11 int l;
12 struct F{
13     double rea,ima;
14     F operator +(const F &x){return (F){rea+x.rea,ima+x.ima};}
15     F operator -(const F &x){return (F){rea-x.rea,ima-x.ima};}
16     F operator *(const F &x){return (F){rea*x.rea-ima*x.ima,rea*x.ima+ima*x.rea};}
17 }a[maxn],b[maxn],c[maxn],w,wn,t1,t2;
18 int read()
19 {
20     int x=0; char ch; bool bo=0;
21     while (ch=getchar(),ch<‘0‘||ch>‘9‘) if (ch==‘-‘) bo=1;
22     while (x=x*10+ch-‘0‘,ch=getchar(),ch>=‘0‘&&ch<=‘9‘);
23     if (bo) return -x; return x;
24 }
25 void fft(F *a,int type)
26 {
27     for (int i=0; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
28     for (int s=2; s<=n; s<<=1)
29     {
30         wn=(F){cos(type*2*pi/s),sin(type*2*pi/s)};
31         for (int i=0; i<n; i+=s)
32         {
33             w=(F){1,0};
34             for (int j=i; j<(i+(s>>1)); j++,w=w*wn)
35             {
36                 t1=a[j],t2=a[j+(s>>1)]*w;
37                 a[j]=t1+t2,a[j+(s>>1)]=t1-t2;
38             }
39         }
40     }
41 }
42 int re(int x)
43 {
44     int t=0;
45     for (int i=0; i<l; i++) t<<=1,t|=x&1,x>>=1;
46     return t;
47 }
48 void init()
49 {
50     m=read();
51     for (n=1; n<2*m; n<<=1) l++;
52     for (int i=0; i<m; i++)
53     {
54         a[i].rea=read(),b[m-i-1].rea=read();
55     }
56     for (int i=0; i<n; i++) rev[i]=re(i);
57     fft(a,1); fft(b,1);
58     for (int i=0; i<n; i++) c[i]=a[i]*b[i];
59     fft(c,-1);
60     for (int i=0; i<n; i++) ans[i]=(int)(c[i].rea/n+0.5);
61     for (int i=m-1; i<2*m-1; i++) printf("%d\n",ans[i]);
62
63 }
64 int main()
65 {
66     init();
67 }

时间: 2024-11-11 05:41:52

BZOJ2194: 快速傅立叶之二的相关文章

bzoj2194 快速傅立叶之二 ntt

bzoj2194 快速傅立叶之二 链接 bzoj 思路 对我这种和式不强的人,直接转二维看. 发现对\(C_k\)贡献的数对(i,j),都是右斜对角线. 既然贡献是对角线,我们可以利用对角线的性质了. 不过右斜角线不太好,我们把每一行都reverse一下,换成左斜角线. 对角线上\(i+j\)相等,可以套上多项式乘法了. 隐藏bug \(a_i,b_i\)均不大于100,而且数字有1e5个 最大值是1e9,而模数是998244353 应该是可以卡掉模数的,但是不故意卡是不可能爆模数的. AC代码

BZOJ2194 快速傅立叶之二 【fft】

题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 第一行一个整数N,接下来N行,第i+2..i+N-1行,每行两个数,依次表示a[i],b[i] (0 < = i < N). 输出格式 输出N行,每行一个整数,第i行输出C[i-1]. 输入样例 5 3 1 2 4 1 1 2 4 1 4 输出样例 24 12 10 6 1 题解 和2179几乎

BZOJ2194: 快速傅立叶之二(NTT,卷积)

Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1776  Solved: 1055[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 &

BZOJ 2194: 快速傅立叶之二

2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1203  Solved: 699[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

【BZOJ 2194】2194: 快速傅立叶之二(FFT)

2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1273  Solved: 745 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 <

【BZOJ 2194】 快速傅立叶之二

2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 430 Solved: 240 [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[

BZOJ_2194_快速傅立叶之二_(FFT+卷积)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2194 给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],...,b[n-1]\). \(c[k]=\sum_{i=k}^{n-1}a[i]b[i-k]\). 求序列\(c[]\). 分析 这题就是BZOJ_3527_[ZJOI2014]_力_(FFT+卷积)的后半段... 我们来重新分析一下. 首先我们要知道卷积的标准形式: $$c[i]=\sum_{j=0}

BZOJ 2194 快速傅立叶之二 ——FFT

[题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽i和k怎么反了. 艹艹艹,把B数组取个反. 靠靠靠,怎么全是零. 算算算,最终的取值范围算错了. 交交交,总算是A掉了. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <

【BZOJ】2194: 快速傅立叶之二

http://www.lydsy.com/JudgeOnline/problem.php?id=2194 题意:求$c[k]=\sum_{k<=i<n} a[i]b[i-k], n<=10^5$ #include <bits/stdc++.h> using namespace std; struct cp { double x, y; cp(double _x=0, double _y=0):x(_x),y(_y) {} cp operator+(const cp &