【HDU1402】A * B Problem Plus(FFT)
来源:互联网 发布:三星自主软件 编辑:程序博客网 时间:2024/04/25 00:55
记录一个菜逼的成长。。
题目链接
用java,普通的高精度也能过。
但这里记下用FFT的方法
学习 及 模板
学习资料里解释的很好。
#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const double PI = acos(-1);const int INF = 0x3f3f3f3f;struct complex{ double r,i; complex(double _r = 0.0,double _i = 0.0) { r = _r; i = _i; } complex operator +(const complex &b) { return complex(r+b.r,i+b.i); } complex operator -(const complex &b) { return complex(r-b.r,i-b.i); } complex operator *(const complex &b) { return complex(r*b.r-i*b.i,r*b.i+i*b.r); }};///雷德算法--倒位序void Rader(complex F[],int len){ for( int i = 1,j = len >> 1; i < len-1; i++ ){ if(i < j)swap(F[i],F[j]); int k = len >> 1; while(j >= k){ j -= k; k >>= 1; } if(j < k)j += k; }}/** * 做FFT * len必须为2^k形式, * on==1时是DFT,on==-1时是IDFT**/void fft(complex F[],int len,int dft){ Rader(F,len); for( int h = 2; h <= len; h <<= 1 ){ complex wn(cos(-dft*2*PI/h),sin(-dft*2*PI/h)); for( int j = 0; j < len; j += h ){ complex w(1,0); for( int k = j; k < j + (h >> 1); k++ ){ complex u = F[k]; complex t = w*F[k+(h>>1)]; F[k] = u + t; F[k+(h>>1)] = u - t; w = w * wn; } } } if(dft == -1) for( int i = 0; i < len; i++ ) F[i].r /= len;}void Conv(complex a[],complex b[],int len){ fft(a,len,1); fft(b,len,1); for( int i = 0; i < len; i++ ) a[i] = a[i] * b[i]; fft(a,len,-1);}const int maxn = 200000 + 10;char str1[maxn],str2[maxn];int sum[maxn];complex a[maxn],b[maxn];int main(){ while(~scanf("%s%s",str1,str2)){ int len1 = strlen(str1); int len2 = strlen(str2); int len = 1; while(len < len1*2 || len < len2*2)len <<= 1; for( int i = 0; i < len1; i++ ){ a[i] = complex(str1[len1-i-1]-'0',0); } for( int i = len1; i < len; i++ ){ a[i] = complex(0,0); } for( int i = 0; i < len2; i++ ){ b[i] = complex(str2[len2-i-1]-'0',0); } for( int i = len2; i < len; i++ ){ b[i] = complex(0,0); } Conv(a,b,len); ///处理精度 for( int i = 0; i < len; i++ ) sum[i] = (int)(a[i].r + 0.5); ///处理进位 for( int i = 0; i < len; i++ ){ sum[i+1] += sum[i] / 10; sum[i] %= 10; } len = len1 + len2; while(len > 0 && sum[len] <= 0)len--; for( ;len >= 0; len-- ) printf("%d",sum[len]); puts(""); } return 0;}
0 0
- hdu1402 A * B Problem Plus (FFT)
- 【HDU1402】A * B Problem Plus(FFT)
- [HDU1402] A * B Problem Plus && FFT模板
- [HDU1402]A * B Problem Plus && FFT模板
- FFT hdu1402 A * B Problem Plus
- 【数论】hdu1402 A * B Problem Plus(FFT)
- HDU1402 A * B Problem Plus[FFT]
- 【FFT】HDU1402 A×B Problem Plus
- hdu1402 A * B Problem Plus 高精度乘法 快速傅里叶变换(FFT)
- hdu1402 A * B Problem Plus
- [HDU1402]A * B Problem Plus
- HDU1402 A * B Problem Plus 大数乘法 FFT(快速傅里叶变换)优化
- hdu1402 A*B FFT
- hdu - 1402 - A * B Problem Plus(FFT)
- hdu 1402 A * B Problem Plus(fft)
- hdu 1402 A * B Problem Plus (FFT + 大数相乘)
- 【HDU 1402】A * B Problem Plus(FFT)
- hdu 1402 A * B Problem Plus(FFT)
- python技巧(10)
- 取余运算
- MVC简介
- 包法利亚夫人
- HTTP 协议详解
- 【HDU1402】A * B Problem Plus(FFT)
- #“Machine Learning”(Andrew Ng)#Week 2_2:Octave/Matlab Tutorial
- python MySQLdb 操作数据库时中文无返回
- ASP.NET MVC 5 中使用Frameset中Session、Cookie值消失的问题完整解决方案
- Win10怎么使用命令查看唤醒系统设备和任务的软件?
- 在慕课上学习的,HTML和CSS基础学习笔记9
- 2017年目标与规划
- 用python做量化投资系列之比特币--初始配置
- 如何用java来进行文件切割和简单的内容过滤