HDU 1402:A * B Problem Plus
A * B Problem Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16932 Accepted Submission(s): 3558
Note: the length of each integer will not exceed 50000.
1 2 1000 2
2 2000
还是没有看懂这道题的代码,(;′⌒`)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
using namespace std;
const int MAX = 200005;
//复数结构体
struct complex
{
double r,i;
complex(double R=0,double I=0)
{
r=R;
i=I;
}
complex operator+(const complex &a)
{
return complex(r+a.r,i+a.i);
}
complex operator-(const complex &a)
{
return complex(r-a.r,i-a.i);
}
complex operator*(const complex &a)
{
return complex(r*a.r-i*a.i,r*a.i+i*a.r);
}
};
/*
*进行FFT和IFFT前的反转变换
*位置i和i的二进制反转后位置互换,(如001反转后就是100)
*len必须去2的幂
*/
void change(complex x[],int len)
{
int i,j,k;
for(i = 1, j = len/2; i <len-1; i++)
{
if (i < j) swap(x[i],x[j]);
//交换互为小标反转的元素,i<j保证交换一次
//i做正常的+1,j做反转类型的+1,始终i和j是反转的
k = len/2;
while (j >= k)
{
j -= k;
k /= 2;
}
if (j < k) j += k;
}
}
/*
*做FFT
*len必须为2^n形式,不足则补0
*on=1时是DFT,on=-1时是IDFT
*/
void fft (complex x[],int len,int on)
{
change(x,len);
for (int i=2; i<=len; i<<=1)
{
complex wn(cos(-on*2*pi/i),sin(-on*2*pi/i));
for (int j=0; j<len; j+=i)
{
complex w(1,0);
for (int k=j; k<j+i/2; k++)
{
complex u = x[k];
complex t = w*x[k+i/2];
x[k] = u+t;
x[k+i/2] = u-t;
w = w*wn;
}
}
}
if (on == -1)
for (int i=0; i<len; i++)
x[i].r /= len;
}
complex x1[MAX],x2[MAX];
char str1[MAX/2],str2[MAX/2];
ll num[MAX],sum[MAX];
int main()
{
int i,len1,len2,len;
while(scanf("%s%s",str1,str2)!=EOF)
{
len1 = strlen(str1);
len2 = strlen(str2);
len = 1;
while (len < 2*len1 || len < 2*len2) len<<=1;
for (i=0; i<len1; i++)
x1[i] = complex(str1[len1-1-i]-'0',0);
for (i=len1; i<len; i++)
x1[i] = complex(0,0);
for (i=0; i<len2; i++)
x2[i] = complex(str2[len2-1-i]-'0',0);
for (i=len2; i<len; i++)
x2[i] = complex(0,0);
fft(x1,len,1);
fft(x2,len,1);
for (i=0; i<len; i++)
x1[i] = x1[i]*x2[i];
fft(x1,len,-1);
for (i=0; i<len; i++)
sum[i] = (int)(x1[i].r+0.5);
for (i=0; i<len; i++)
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
len = len1+len2-1;
while (sum[len]<=0 && len>0) len--;
for (i=len; i>=0; i--)
printf("%c",(char)sum[i]+'0');
printf("\n");
}
return 0;
}
HDU 1402:A * B Problem Plus的更多相关文章
- hdu 1402 A * B Problem Plus FFT
/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...
- HDU - 1402 A * B Problem Plus FFT裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...
- HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式
http://acm.hdu.edu.cn/showproblem.php?pid=1402 快速傅里叶变换优化的高精度乘法. https://blog.csdn.net/ggn_2015/artic ...
- HDU 1402 A * B Problem Plus(FFT)
Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to ...
- 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 ...
- hdu 1402 A * B Problem Plus (FFT模板)
A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...
- 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 ...
- HDU 1402 A * B Problem Plus (FFT模板题)
FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...
- HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)
题意:计算A*B,A,B均为长度小于50000的整数. 这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT. A和B ...
随机推荐
- Tomcat类加载器机制
Tomcat为什么需要定制自己的ClassLoader: 1.定制特定的规则:隔离webapp,安全考虑,reload热插拔 2.缓存类 3.事先加载 要说Tomcat的Classloader机制,我 ...
- switch为什么不能用string类型?
switch()括号里面的参数是一个int型值啊 你要可以转换为int型的参数才行得通啊
- SQL 2008 数据库只读 修改
先对数据库分离 数据库鼠标右键->任务->分离 将UsersDB.mdf UsersDB_log.LDF文件 属性->安全->编辑 两个文件的都要更改权限 ...
- 树链剖分(线段树区间更新求和(lazy操作)hdu3966)
题意:给出一颗树形图,有三种操作,I:在u到v的路径上的每个点的权值+d,D:在u到v的路径上的每个点的权值都-d,Q询问u点的权值 #pragma comment(linker, "/ST ...
- .net 中 ref out params的区别
C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...
- c++ 中this底层
成员变量设置在一个结构体中, 操作成员变量的成员函数,其实质上就是拥有一个隐藏的 成员变量结构体的地址指针,俗称this指针.
- centos 关闭不使用的服务
CentOS关闭服务的方法: chkconfig –level 2345 服务名称 off 服務名稱 建議 說明 acpid 停用 Advanced Configuration and Power I ...
- C# 多线程 lock 实例
class Program { static void Main(string[] args) { //在t1线程中调用LockMe,并将deadlock设为true(将出现死锁) int i = 1 ...
- sql server添加列
alter table 表名 add 列名 数据类型如:alter table student add sex char(2)
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境(转)
原文地址:http://blog.csdn.net/shangyuan21/article/details/18153605 我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是M ...