FFT 模板(hdu 1402)
来源:互联网 发布:关机准备配置windows 编辑:程序博客网 时间:2024/05/18 01:47
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define pi acos(-1.0)
char str1[5000100],str2[5000100];
int num[5000100];
int len1,len2,n,m;
struct Complex{
double r,i;
Complex(){};
Complex(double x,double y){
r=x;i=y;
}
Complex operator +(const Complex &t)const{
return Complex(r+t.r,i+t.i);
}
Complex operator -(const Complex &t)const{
return Complex(r-t.r,i-t.i);
}
Complex operator *(const Complex &t)const{
return Complex(r*t.r-i*t.i,r*t.i+i*t.r);
}
}x1[5000100],x2[5000100];
void fft(Complex y[],int n,int rev)
{
for(int i=1,j,k,t;i<n;i++){
for(j=0,k=n>>1,t=i;k;k>>=1,t>>=1) j=j<<1|t&1; //二进制位置互换
if(i<j) swap(y[i],y[j]);
}
for(int s=2,ds=1;s<=n;ds=s,s<<=1){ //控制层数
Complex wn=Complex(cos(rev*2*pi/s),sin(rev*2*pi/s)),w=Complex(1,0),t; //初始化单位复根和螺旋因子
for(int k=0;k<ds;k++,w=w*wn){ //更新螺旋因子
for(int i=k;i<n;i+=s){
t=w*y[i+ds]; //蝴蝶操作
y[i+ds]=y[i]-t;
y[i]=y[i]+t;
}
}
}
if(rev==-1) for(int i=0;i<n;i++) y[i].r/=n; //求逆
}
int main()
{
int i,j,k,t;
while(scanf("%s%s",str1,str2)!=EOF)
{
len1=strlen(str1);
len2=strlen(str2);
n=1;
while(n<len1+len2) n<<=1;
for(i=0;i<len1;i++) x1[i]=Complex(str1[len1-i-1]-'0',0);
for(;i<n;i++) x1[i]=Complex(0,0);
for(i=0;i<len2;i++) x2[i]=Complex(str2[len2-i-1]-'0',0);
for(;i<n;i++) x2[i]=Complex(0,0); //长度扩展
fft(x1,n,1);
fft(x2,n,1); //系数表达式转点值表达式
for(i=0;i<n;i++) x1[i]=x1[i]*x2[i]; //点值运算
fft(x1,n,-1); //求插值
for(i=0,t=0;i<n;i++,t/=10){ //结果处理
t+=(int)(x1[i].r+0.1);
num[i]=t%10;
}
for(;t;t/=10) num[i]=t%10;
while(n>1&&!num[n-1]) n--;
for(i=n-1;i>=0;i--) printf("%d",num[i]);
printf("\n");
}
return 0;
}
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define pi acos(-1.0)
char str1[5000100],str2[5000100];
int num[5000100];
int len1,len2,n,m;
struct Complex{
double r,i;
Complex(){};
Complex(double x,double y){
r=x;i=y;
}
Complex operator +(const Complex &t)const{
return Complex(r+t.r,i+t.i);
}
Complex operator -(const Complex &t)const{
return Complex(r-t.r,i-t.i);
}
Complex operator *(const Complex &t)const{
return Complex(r*t.r-i*t.i,r*t.i+i*t.r);
}
}x1[5000100],x2[5000100];
void fft(Complex y[],int n,int rev)
{
for(int i=1,j,k,t;i<n;i++){
for(j=0,k=n>>1,t=i;k;k>>=1,t>>=1) j=j<<1|t&1; //二进制位置互换
if(i<j) swap(y[i],y[j]);
}
for(int s=2,ds=1;s<=n;ds=s,s<<=1){ //控制层数
Complex wn=Complex(cos(rev*2*pi/s),sin(rev*2*pi/s)),w=Complex(1,0),t; //初始化单位复根和螺旋因子
for(int k=0;k<ds;k++,w=w*wn){ //更新螺旋因子
for(int i=k;i<n;i+=s){
t=w*y[i+ds]; //蝴蝶操作
y[i+ds]=y[i]-t;
y[i]=y[i]+t;
}
}
}
if(rev==-1) for(int i=0;i<n;i++) y[i].r/=n; //求逆
}
int main()
{
int i,j,k,t;
while(scanf("%s%s",str1,str2)!=EOF)
{
len1=strlen(str1);
len2=strlen(str2);
n=1;
while(n<len1+len2) n<<=1;
for(i=0;i<len1;i++) x1[i]=Complex(str1[len1-i-1]-'0',0);
for(;i<n;i++) x1[i]=Complex(0,0);
for(i=0;i<len2;i++) x2[i]=Complex(str2[len2-i-1]-'0',0);
for(;i<n;i++) x2[i]=Complex(0,0); //长度扩展
fft(x1,n,1);
fft(x2,n,1); //系数表达式转点值表达式
for(i=0;i<n;i++) x1[i]=x1[i]*x2[i]; //点值运算
fft(x1,n,-1); //求插值
for(i=0,t=0;i<n;i++,t/=10){ //结果处理
t+=(int)(x1[i].r+0.1);
num[i]=t%10;
}
for(;t;t/=10) num[i]=t%10;
while(n>1&&!num[n-1]) n--;
for(i=n-1;i>=0;i--) printf("%d",num[i]);
printf("\n");
}
return 0;
}
阅读全文
0 0
- FFT 模板(hdu 1402)
- hdu 1402 FFT(模板)
- HDU 1402 A*B(FFT 模板题)
- HDU 1402 A * B Problem Plus (FFT模板题)
- hdu 1402 A * B Problem Plus FFT模板
- HDU 1402 FFT模板题,求大数乘法
- HDU 1402 A * B Problem Plus (FFT模板题)
- [FFT 模板题] HDU 1402:A*B Problem Plus
- hdu 1402 A * B Problem Plus FFT模板
- hdu 1402 FFT
- HDU 1402 FFT
- HDU 1402 FFT
- hdu 1402(FFT)
- [FFT] HDU 1402
- hdu 5730 (CDQ+FFT)模板题
- (模板)FFT
- FFT模板
- FFT模板
- git学习笔记整理-3提交与移除
- 事务的四种隔离级别和七种传播机制
- [HDU6074] Phone Call
- Kotlin Reference (八) Classes and Objects
- node.js测试: 如何利用import / require语法打桩测试指定函数/ 类方法
- FFT 模板(hdu 1402)
- 常用正则表达式
- 一些在线工具
- HDU 6069 Counting Divisors
- cocos骨骼动画
- QML中能使用什么JS库
- 时间序列数据的存储和计算
- 发布Feature service
- 网络adb调试(无root)