╰( ̄▽ ̄)╭

给出2个大整数A,B,计算A*B的结果。

(A,B的长度 <= 100000,A,B >= 0)

(⊙ ▽ ⊙)

把大整数A看做一个次数界为lenA的多项式A(x),其中x=10,

同样,把B看做一个次数界为lenB的多项式B(x),其中x=10。

然后套上快速傅里叶变换

( ̄~ ̄)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const char* fin="ftt.in";
const char* fout="fttx.out";
const int inf=0x7fffffff;
const double pi=acos(-1),eps=10e-6;
const int maxn=400007;
struct Z{
double x,y;
Z(double _x=0,double _y=0){x=_x;y=_y;}
Z operator +(const Z &b){return Z(x+b.x,y+b.y);}
Z operator -(const Z &b){return Z(x-b.x,y-b.y);}
Z operator *(const Z &b){return Z(x*b.x-y*b.y,x*b.y+y*b.x);}
}a[maxn],b[maxn],t[maxn];
int ans[maxn],lena,lenb,n,N,i,j,k;
void read(Z *a,int &len){
int i,j,k;
char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') a[len++]=ch-'0',ch=getchar();
for (i=0;i<(len+1)/2;i++) swap(a[i],a[len-i-1]);
}
void getn(){
int i,j,k=max(lena,lenb);
for (n=1;n<k;n<<=1) N++;
n<<=1;N++;
}
int fan(int v){
int i=N,k=0;
while (i--){
k=(k<<1)+(v&1);
v>>=1;
}
return k;
}
void fft(Z *a,int sig){
int i,j,k,m;
for (i=0;i<n;i++) t[fan(i)]=a[i];
for (m=2;m<=n;m<<=1){
int ha=m/2;
for (i=0;i<ha;i++){
Z w(cos(i*sig*pi/ha),sin(i*sig*pi/ha));
for (j=i;j<n;j+=m){
Z u=t[j],v=w*t[j+ha];
t[j]=u+v;
t[j+ha]=u-v;
}
}
}
for (i=0;i<n;i++) a[i]=t[i];
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
read(a,lena);read(b,lenb);
getn(); fft(a,1);
fft(b,1);
for (i=0;i<n;i++) a[i]=a[i]*b[i];
fft(a,-1); for (i=0;i<=n;i++){
ans[i]+=int(a[i].x/n+eps);
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
while (!ans[n]) n--;
for (;n>=0;n--) printf("%d",ans[n]);
return 0;
}

(⊙v⊙)

Pay Attention

1.read()中,不要把len打成lena;
翻转大整数时,是从0枚举到(len+1)/2; 2.getn()中,n最后要再乘一次2,因为:
A*B的次数界是lena*lenb。 3.maxn要开到4倍; 4.pi=acos(-1); 5.当对一个小数x用int()取整时,需要打成int(x+eps),其中,eps=10e-6。

【51NOD1028】大数乘法 V2的更多相关文章

  1. ACM学习历程—51NOD1028 大数乘法V2(FFT)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这 ...

  2. 51 Nod 1028 大数乘法 V2【Java大数乱搞】

    1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A ...

  3. 1028 大数乘法 V2(FFT or py)

    1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果.   Input 第1行:大数A 第2行:大数B ...

  4. 51Nod 1028 大数乘法 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #inc ...

  5. FFT/NTT [51Nod 1028] 大数乘法 V2

    题目链接:51Nod 传送门 没压位,效率会低一点 1.FFT #include <cstdio> #include <cstring> #include <algori ...

  6. 51nod 1028 大数乘法 V2 【FFT模板题】

    题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; nam ...

  7. 51nod 1027大数乘法

    题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...

  8. [POJ] #1001# Exponentiation : 大数乘法

    一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: ...

  9. 用分治法实现大数乘法,加法,减法(java实现)

    大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成 A(x)=a*x^m+b B(x)=c*x^m+d 其中a,b,c ...

随机推荐

  1. HZOI20190803 B题

    题目:https://www.cnblogs.com/Juve/articles/11295333.html 话说这题方法挺多 40分:暴力 65:莫队,你会T得飞起 我考场上没打出带修莫队,没有修改 ...

  2. 在Linux下使用gcc运行C语言程序

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具.本教程毫不犹豫地使用GCC来编译C程序. ...

  3. 写一个网页进度loading

    作者:jack_lo www.jianshu.com/p/4c93f5bd9861 如有好文章投稿,请点击 → 这里了解详情 loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在 ...

  4. 用Jmeter参数化实现接口自动化测试

    本文记录如何使用Jmeter参数化(csv)实现接口自动化——测试Token不同入参情况下,接口请求能够返回正确的结果 1. 首先需要使用Jmeter获取一个Token,如何获取暂略(同一般访问请求方 ...

  5. 023-linux(2)

    1. head 查看文件的前N行 -n ,表示查看前几行 head - test.txt 2. tail 查看文件的后N行 -n,表示查看文件的后几行 tail - test.txt -f(循环读取) ...

  6. JasperReports报表字段11

    报表字段是代表数据源和报表模板之间的数据映射元素.字段可以在报告中的表达式进行组合,以获得所需的输出.报表模板可以包含零个或更多的<field>元素.当声明报表字段,数据源应提供相应的数据 ...

  7. java普通for循环和for-each迭代循环的区别

    PO实体类User: package aA; public class User { private String name; private int many; private int id; pu ...

  8. 2018-2-13-win10-uwp-设置启动窗口大小--获取窗口大小

    title author date CreateTime categories win10 uwp 设置启动窗口大小 获取窗口大小 lindexi 2018-2-13 17:23:3 +0800 20 ...

  9. 9.2专项测试-Android性能测试黑盒分析-1

    1. 专项测试 业务测试:面向新需求 回归测试:面向已交付需求 专项测试:面向非功能需求的各类质量唯独特征 表现 用户维度 技术维度 崩溃 crash,弱网 检测崩溃1.某个页面,因为研发处理不合适, ...

  10. 全景还原报错现场 | 应用实时监控 ARMS 上线用户行为回溯功能

    随着前端技术日新月异迅猛发展,为了实现更好的前端性能,最大程度提高用户体验,支持单页应用的框架逐渐占领市场,如众所周知的React,Vue等等.但是在单页应用的趋势下,快速定位并解决JS错误却成为一大 ...