【51NOD1028】大数乘法 V2
╰( ̄▽ ̄)╭
给出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的更多相关文章
- ACM学习历程—51NOD1028 大数乘法V2(FFT)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这 ...
- 51 Nod 1028 大数乘法 V2【Java大数乱搞】
1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A ...
- 1028 大数乘法 V2(FFT or py)
1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B ...
- 51Nod 1028 大数乘法 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #inc ...
- FFT/NTT [51Nod 1028] 大数乘法 V2
题目链接:51Nod 传送门 没压位,效率会低一点 1.FFT #include <cstdio> #include <cstring> #include <algori ...
- 51nod 1028 大数乘法 V2 【FFT模板题】
题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; nam ...
- 51nod 1027大数乘法
题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...
- [POJ] #1001# Exponentiation : 大数乘法
一. 题目 Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 156373 Accepted: ...
- 用分治法实现大数乘法,加法,减法(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 ...
随机推荐
- Quick BI 的模型设计与生成SQL原理剖析
一.摘要 随着物联网的告诉发展,数据量呈现井喷式的增长,如何来分析和使用这些数据,使数据产生商业价值,已经变得越来越重要.值得高兴的是,当前越来越多的人已经意识到了用数据分析决定商业策略的重要性,也都 ...
- SQL的特点
1.综合统一 2.高度非过程化 3.面向集合的操作方式 4.一同一种语法结构提供两种使用5.语言简洁易学易用
- idea如何清晰地查看java类的继承结构及该类的所有方法?
转载自:https://blog.csdn.net/luo609630199/article/details/82192938 我们在世用idea是平时除了编码外,有时我们需要查看源码或者别人写的代码 ...
- 关于开启Eureka安全Security认证后,客户端死活注册不上的问题
遇到一个问题"开启Eureka服务端的安全认证后,客户端死活注册不到Eureka上",已经尝试了以下办法,完全搞不定... 客户端出错的版本: spring-boot:2.0.3. ...
- 微服务注册发现集群搭建—单机版(Registrator+Consul+Consul-template+nginx)
1.创建模板文件 docker-compose.yml #backend web application, scale this with docker-compose scale web=3 web ...
- Vue. 之 刷新当前页面,重载页面数据
Vue. 之 刷新当前页面,重载页面数据 如下截图,点击左侧不同的数据,右侧根据左侧的KEY动态加载数据.由于右侧是同一个页面,在进行路由跳转后,不会再次刷新数据. 解决方案: 右侧的页面中 scri ...
- spring定时任务scheduler集群环境下指定运行服务器防止多服务器多次执行
使用spring的@Scheduler注解可以非常方便的启动一个定时任务,但是当服务部署在多台服务器上做负载均衡的时候,可能会出现重复执行的情况. 现在我们通过代码指定job只在某一台机器执行. 首先 ...
- Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改
# gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...
- 2017年8月9日学习内容存放 #socket通信介绍
2017年8月9日学习内容存放 #socket通信介绍 ''' OSI七层 应用 表示 会话 传输 网络 ip 数据链路 mac 物理层 网线 http smtp dns ftp ssh snmp i ...
- Unknown command: crawl
Use "scrapy" to see available commands 1.使用命令行方式cmd,是因为没有cd到项目的根目录,crawl会去搜索cmd目录下的scrapy. ...