【BZOJ】【2179】FFT快速傅里叶

FFT

  做的第二道用到FFT的……好吧其实还是模板题-_-b

  百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=。=

  

 1 /**************************************************************
 2     Problem: 2179
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:1236 ms
 7     Memory:9184 kb
 8 ****************************************************************/
 9
10 //BZOJ 2179
11 #include<cmath>
12 #include<cstdio>
13 #include<cstring>
14 #include<cstdlib>
15 #include<iostream>
16 #include<algorithm>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 using namespace std;
21 void read(int &v){
22     v=0; int sign=1; char ch=getchar();
23     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
24     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
25     v*=sign;
26 }
27 /******************tamplate*********************/
28 #define debug
29 const int N=150010;
30 const double pi=acos(-1.0);
31 struct comp{
32     double r,i;
33     comp(double _r=0.0,double _i=0.0):r(_r),i(_i){}
34 //  comp(){}
35     comp operator+(const comp &b)const{return comp(r+b.r,i+b.i);}
36     comp operator-(const comp &b)const{return comp(r-b.r,i-b.i);}
37     comp operator*(const comp &b)const{return comp(r*b.r-i*b.i,r*b.i+i*b.r);}
38 }a[N],b[N],c[N];
39
40 void FFT(comp *a,int n,int type){
41     for(int i=1,j=0;i<n-1;++i){//只需改变1~n-2,0和n-1两个位置不变
42         for(int s=n;j^=s>>=1,~j&s;);
43         if (i<j) swap(a[i],a[j]);
44     }
45     for(int m=1;m<n;m<<=1){
46         double u=pi/m*type; comp wm(cos(u),sin(u));
47         for(int i=0;i<n;i+=(m<<1)){
48             comp w(1,0);
49             rep(j,m){
50                 comp &A=a[i+j+m],&B=a[i+j],t=w*A;
51                 A=B-t; B=B+t; w=w*wm;
52             }
53         }
54     }
55     if (type==-1) rep(i,n) a[i].r/=n;
56 }
57 char s1[N],s2[N];
58 int ans[N];
59 int main(){
60     int n,k;
61     read(n);
62     scanf("%s%s",s1,s2);
63     rep(i,n){
64         a[i].r=s1[n-i-1]-‘0‘;
65         b[i].r=s2[n-i-1]-‘0‘;
66     }
67     for(k=1;k<=n*2;k<<=1);
68     FFT(a,k,1); FFT(b,k,1);
69     F(i,0,k) c[i]=a[i]*b[i];
70     FFT(c,k,-1);
71     F(i,0,n*2)
72         ans[i]=c[i].r+0.4;
73     int temp=0;
74     F(i,0,n*2){
75         if (ans[i]) temp=i;
76         ans[i+1]+=ans[i]/10;
77         ans[i]%=10;
78     }
79     D(i,temp,0) printf("%d",ans[i]);
80     return 0;
81 }

时间: 2025-01-31 04:02:44

【BZOJ】【2179】FFT快速傅里叶的相关文章

bzoj 2179: FFT快速傅立叶 -- FFT

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MB Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Output 12 数据范围: n<=60000 HINT #include<map> #include

BZOJ 2179: FFT快速傅立叶

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3138  Solved: 1620[Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Outpu

BZOJ 2179 FFT快速傅立叶 ——FFT

[题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆矩阵又减轻了拉格朗日插值法的复杂度. 十分神奇. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #includ

BZOJ 2179 FFT快速傅立叶 快速傅里叶变换

题目大意:给定两个高精度整数,求两个数的乘积 FFT大法好 系统的complex比手写慢了2.5倍 简直吓死人- - #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 131080 #define PI 3.1415926535897932384626433832795028841971

【BZOJ】2179: FFT快速傅立叶(fft)

http://www.lydsy.com/JudgeOnline/problem.php?id=2179 fft裸题.... 为嘛我的那么慢....1000多ms.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue>

【BZOJ 2179】【FFT模板】 FFT快速傅立叶

2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1595 Solved: 792 [Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Output

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

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3108  Solved: 1599[Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 数据范围: n<=60000 扔个模板 注意读入字符转换成系数 系数转换成整数 #include <i

FFT快速傅里叶模板

FFT快速傅里叶模板-- /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < 2 * len1 || len < 2 * len2) len <<= 1; 2. for i=0 to len1-1 : x1[i](f(i),0) for i=len1 to len-1 : x1[i](0.0) g(x) is same..... 3. fft(x1,len,1) ff

【BZOJ-2179】FFT快速傅里叶 FFT

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2978  Solved: 1523[Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Outpu