日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

發(fā)布時間:2024/4/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述

給出兩個n位10進制整數(shù)x和y,你需要計算x*y。

輸入輸出格式

輸入格式:

?

第一行一個正整數(shù)n。 第二行描述一個位數(shù)為n的正整數(shù)x。 第三行描述一個位數(shù)為n的正整數(shù)y。

?

輸出格式:

?

輸出一行,即x*y的結(jié)果。(注意判斷前導(dǎo)0)

?

輸入輸出樣例

輸入樣例#1:?復(fù)制 1 3 4 輸出樣例#1:?復(fù)制 12

說明

數(shù)據(jù)范圍:

n<=60000

來源:bzoj2179

本題數(shù)據(jù)為洛谷自造數(shù)據(jù),使用CYaRon耗時5分鐘完成數(shù)據(jù)制作。

?

emmmm感覺學(xué)了FFT沒什么亂用啊,,

也就來水一水這種板子吧。

思路很簡單,將每一位看成多項式的系數(shù)。

來一遍FFT

最后去掉前導(dǎo)0

輸出

不過話說我的FFT怎么這么慢

?

#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int MAXN=1e5+10; const double Pi=acos(-1.0); int r[MAXN],l=0,limit=1,c[MAXN]; char sa[MAXN],sb[MAXN]; struct complex {double x,y;complex(double xx=0,double yy=0){x=xx,y=yy;} }a[MAXN],b[MAXN]; complex operator + (complex a,complex b){return complex(a.x+b.x,a.y+b.y);} complex operator - (complex a,complex b){return complex(a.x-b.x,a.y-b.y);} complex operator * (complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} void FFT(complex *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){complex Wn(cos(Pi/mid),type*sin(Pi/mid) );for(int R=mid<<1,j=0;j<limit;j+=R){complex w(1,0);for(int k=0;k<mid;k++,w=w*Wn){complex x=a[j+k],y=w*a[j+k+mid];a[j+k]=x+y;a[j+k+mid]=x-y;}}} } int main() {#ifdef WIN32freopen("a.in","r",stdin);#else #endifint N;scanf("%d",&N);N--;scanf("%s%s",sa,sb);for(int i=0;i<=N;i++) a[i].x=sa[N-i]-'0',b[i].x=sb[N-i]-'0';while(limit<=N*2) limit<<=1,l++;for(int i=0;i<=limit;i++) r[i]=(r[i>>1]>>1) | ((i&1)<<(l-1) );FFT(a,1);FFT(b,1);for(int i=0;i<=limit;i++) a[i]=a[i]*b[i];FFT(a,-1);for(int i=0;i<=limit;i++) c[i]=(int)(a[i].x/limit+0.5);//for(int i=1;i<=limit;i++) printf("%d ",c[i]);printf("\n");for(int i=0;i<=limit;i++){if(c[i]>10){c[i+1]+=c[i]/10,c[i]%=10;if(i+1>limit) limit++;}}for(int i=limit;i>=0;i--)if(c[i]==0) limit--;else break;for(int i=limit;i>=0;i--)printf("%d",c[i]);return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。