/*
hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才有点儿感觉,原来FFT在这里就是加速大整数乘法而已 像前一题,也是一个大整数乘法,然后去掉一些非法的情况 */
#pragma warning(disable : 4786)
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>//priority_queue
#include <bitset>
#include <complex>
#include <utility>
/*
**make_pair()
**/
using namespace std;
const double eps=1e-8;
const double PI=acos(-1.0);
const int inf=0x7fffffff;
template<typename T> inline T MIN(T a,T b){return a<b?a:b;}
template<typename T> inline T MAX(T a,T b){return a>b?a:b;}
template<typename T> inline T SQR(T a){return a*a;}
inline int dbcmp(double a){return a>eps?(1):(a<(-eps)?(-1):0);} typedef __int64 LL;
int n;
const int size=400040;
int data[size/4];
int sum[size];
complex<double> x1[size],num1[size],num2[size]; void change(complex<double> y[],int len)
{
int i,j,k;
for(i = 1, j = len/2;i < len-1;i++)
{
if(i < j)swap(y[i],y[j]);
k = len/2;
while( j >= k)
{
j -= k;
k /= 2;
}
if(j < k)j += k;
}
}
void fft(complex<double> y[],int len,int on)
{
change(y,len);
for(int h = 2;h <= len;h <<= 1)
{
complex<double> wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
for(int j = 0;j < len;j += h)
{
complex<double> w(1,0);
for(int k = j;k < j+h/2;k++)
{
complex<double> u = y[k];
complex<double> t = w*y[k+h/2];
y[k] = u+t;
y[k+h/2] = u-t;
w = w*wn;
}
}
}
if(on == -1)
for(int i = 0;i < len;i++)
y[i].real(y[i].real()/len);
}
char s1[size];
char s2[size];
int main() {
// your code goes here
int t,i,j;
int len,len1,len2;
//cin>>t;
while(gets(s1))
{
gets(s2);
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
len1=strlen(s1);
len2=strlen(s2);
//printf("%d %d",len1,len2);
len=1;
while(len<2*len1||len<len2*2) len<<=1;
for(i=len1-1,j=0;i>=0;--i,++j)
{
num1[j]=complex<double>(s1[i]-'0',0);
}
while(j<=len)
{
num1[j]=complex<double>(0,0);
++j;
}
for(i=len2-1,j=0;i>=0;--i,++j)
{
num2[j]=complex<double>(s2[i]-'0',0);
}
while(j<=len)
{
num2[j]=complex<double>(0,0);
++j;
}
fft(num1,len,1);
fft(num2,len,1);
for(i=0;i<len;++i)
{
num1[i]=num1[i]*num2[i];
}
fft(num1,len,-1); for(i=0;i<len;++i)
{
sum[i]=(int)(num1[i].real()+0.5);
}
for(i=0;i<len;++i)
{
sum[i+1]+=sum[i]/10;
sum[i]=sum[i]%10;
}
len=len1+len2-1;
while(sum[len]<=0&&len>0) --len;
for(;len>=0;--len)
{
printf("%c",sum[len]+'0');
}
printf("\n");
}
return 0;
}

hdu 1402 A * B Problem Plus FFT的更多相关文章

  1. HDU - 1402 A * B Problem Plus FFT裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...

  2. HDU 1402 A * B Problem Plus (FFT求高精度乘法)

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. HDU 1402 A * B Problem Plus (FFT模板题)

    FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...

  4. HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)

    题意:计算A*B,A,B均为长度小于50000的整数. 这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT. A和B ...

  5. HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 快速傅里叶变换优化的高精度乘法. https://blog.csdn.net/ggn_2015/artic ...

  6. hdu 1402 A * B Problem Plus (FFT模板)

    A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...

  7. HDU 1402 A * B Problem Plus(FFT)

    Problem Description Calculate A * B.   Input Each line will contain two integers A and B. Process to ...

  8. FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus

    Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: th ...

  9. HDU 1402 A * B Problem Plus ——(大数乘法,FFT)

    因为刚学fft,想拿这题练练手,结果WA了个爽= =. 总结几点犯的错误: 1.要注意处理前导零的问题. 2.一定要注意数组大小的问题.(前一个fft的题因为没用到b数组,所以b就没管,这里使用了b数 ...

随机推荐

  1. valgrind 的使用及错误信息分析

          这里记录一下使用valgrind查找你的应用程序中的各种潜在的错误信息,并举例说明. 经常使用valgrind查找一下你的代码的内存有关错误,对移植到嵌入系统后的系统稳定性来说有着重要的意 ...

  2. 通过yum升级CentOS/RHEL最小化安装

    1.如果你有安装CentOS / RHEL最小服务器安装,您可能有很多麻烦没有安装包 2.有一种方法来安装所有的包,需要一个基本的服务器,使用yum groupinstall命令 3.从最小的安装基本 ...

  3. svg转换工具

    package com.rubekid.springmvc.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...

  4. 无法连接vCenter Server清单https://IP:10443

    VMware vCenter Server服务器安装系统的时候使用一个IP,安装完VMware vCenter后来更换了另外一个IP,当使用vSphere Web Client登陆VMware vCe ...

  5. Swift - 36 - 结尾闭包(Trailing closure)和捕获数值(Capturing Values)的简单介绍

    //: Playground - noun: a place where people can play import UIKit // 初始化一个整数数组 var arr = [1, 3, 5, 7 ...

  6. 限制窗口拉伸范围(二)——OnSizing

    之前用的GetMinMaxInfo,在VS2015中会导致:Report模式的CListCtrl随窗口拉伸时,表头无法绘制超过原大小的区域.其他版本和控件未测试,而OnSizing没有这问题. 前一方 ...

  7. 【C++学习之路】派生类的构造函数(三)

    三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 class student { public: student(int n, string nam) ...

  8. 转载,crtmpserver文件夹结构分析

    1. 顶层(crtmpserver/) 下的文件夹结构 3rdparty/             : 对lua, xml进行解析的源代码文件夹 sources/              : 项目的 ...

  9. createwindow

    WNDCLASS wndclass; wndclass.hbrBackground=(HBRUSH)getstockobject(WHITE_BRUSH); wndclass.hCursor=Load ...

  10. php 被抛弃使用的函数

    call_user_method()(使用 call_user_func() 替代)     call_user_method_array() (使用 call_user_func_array() 替 ...