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 ...
随机推荐
- 为Virtual Studio Code配置Python调试插件(Ubuntu14.04)
详情见以下python for virtual studio code插件的链接: python 安装依赖 1.Python is installed on the current system Pa ...
- PostgreSQL Performance Monitoring Tools
PostgreSQL Performance Monitoring Tools https://github.com/CloudServer/postgresql-perf-tools This pa ...
- VS2012离线安装Xamarin (含破解补丁)
Xamarin离线安装包 来源于 忘忧草 特此感谢! 离线安装不成功:参考源 http://www.cnblogs.com/zjoch/p/3937014.html / http://www.cnb ...
- Android so lib库远程http下载和动态注册
一.背景 在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过 ...
- jQuery习题的一些总结
1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has $("div:has(s ...
- bzoj4448 [Scoi2015]情报传递
第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...
- drds 分库表的创建速记
关键词 :dbpartition by hash(`INVESTOR_APPLY_ID`) 格式 :dbpartition by hash(分库字段) 创建例子: CREATE TABLE `BB_J ...
- 把所有特权给root '%'所有IP
grant all privileges on *.* to root@'%' identified by 'root'; --把所有特权给root '%'所有IP
- oracle的索引维护
索引重建 Alter index idx_name rebuild partition index_partition_name [online nologging] 需要对每个分区索引做rebuil ...
- 夺命雷公狗ThinkPHP项目之----企业网站24之网站前台列表页面包屑导航的显示
我们做面包屑导航的原理其实也是很简单的,我们的思路是: 首先找到该分类的id ,我们可以通过大 I来进行获取得到: 然后通过 大 D 方法让数据进入model层里面进行循环迭代查询, 当然,测试时候发 ...