题意:大数相乘。

主要是存板子的,一个FFT,一个NNT。其中FFT可能存在精度问题。有的时候会被卡精度,比如题目要求取模时,这时我们一般用NNT。

//FFT
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;const double PI=acos(-1.0);
struct complex{double r,i;complex(double _r=0,double _i=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 change(complex y[],int len)
{for(int i=1,j=len/2;i<len-1;i++){if(i<j) swap(y[i],y[j]);int k=len/2;while(j>=k){j-=k;k/=2;}if(j<k) j+=k;}
}void fft(complex y[],int len,int on)
{change(y,len);for(int h=2;h<=len;h<<=1){complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));for(int j=0;j<len;j+=h){complex w(1,0);for(int k=j;k<j+h/2;k++){complex u=y[k];complex t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(on==-1){for(int i=0;i<len;i++) y[i].r/=len;}
}
const int maxn=200010;
char a[maxn/2],b[maxn/2];
complex x1[maxn],x2[maxn];
int ans[maxn];
int main()
{while(scanf("%s",a)!=EOF){scanf("%s",b);int len1 = strlen(a);int len2 = strlen(b);int len = 1;while(len < len1*2 || len < len2*2)len<<=1;for(int i=0;i<len1;i++)x1[i]=complex(a[len1-i-1]-'0',0);for(int i=len1;i<len;i++)x1[i]=complex(0,0);for(int i=0;i<len2;i++)x2[i]=complex(b[len2-i-1]-'0',0);for(int i=len2;i<len;i++)x2[i]=complex(0,0);fft(x1,len,1);fft(x2,len,1);for(int i=0;i<len;i++)x1[i]=x1[i]*x2[i];fft(x1,len,-1);for(int i=0;i<len;i++)ans[i]=(int)(x1[i].r+0.5);for(int i=0;i<len;i++){ans[i+1]+=ans[i]/10;ans[i]%=10;}int flag=0;len=len1+len2-1;while(ans[len] <= 0 && len > 0)len--;for(int i = len;i >= 0;i--)printf("%c",ans[i]+'0');printf("\n");}return 0;
}
//NNT
#include<bits/stdc++.h>using namespace std;
typedef long long ll;const int maxn = 2e5 + 50;
const ll mod = 998244353;inline ll qpow(ll a, ll b)
{ll sum = 1;while (b){if (b & 1)sum = sum * a % mod;b >>= 1;a = a * a % mod;}return sum;
}inline ll Inv(ll a, ll _mod)
{return qpow(a, _mod - 2);
}struct NTT
{int rev[maxn], dig[105];int N, L;ll g;void init_rev(int n){//初始化原根g = 3;for (N = 1, L = 0; N <= n; N <<= 1, L++);memset(dig,0,sizeof(int)*(L+1));for (int i = 0; i < N; i++){rev[i] = 0;int len = 0;for (int t = i; t; t >>= 1)dig[len++] = t & 1;for (int j = 0; j < L; j++)rev[i] = (rev[i] << 1) | dig[j];}}void DFT(vector<ll>&a , int flag){for (int i = 0; i < N; i++)if (i < rev[i])swap(a[i], a[rev[i]]);for (int l = 1; l < N; l <<= 1){ll wn;if (flag == 1)wn = qpow(g, (mod - 1) / (2*l));elsewn = qpow(g, mod - 1 - (mod - 1) / (2*l));for (int k = 0; k < N; k += l*2){ll w = 1;ll x,y;for (int j = k; j < k + l; j++){x = a[j];y = a[j+l] * w % mod;a[j] = (x + y) % mod;a[j + l] = (x - y + mod) % mod;w = w * wn % mod;}}}if (flag == -1){ll x = Inv(N, mod);for (int i = 0; i < N; i++)a[i] = a[i] * x % mod;}}void mul(vector<ll>& a,vector<ll>& b,int m){init_rev(m);a.resize(N);b.resize(N);DFT(a, 1);DFT(b, 1);for (int i = 0; i < N; i++)a[i] = a[i] * b[i]%mod;DFT(a, -1);int len = N;while(a[len]==0) len--;a.resize(len+1);}
} ntt;vector<ll> v[maxn];
char s[100006];
ll ans[200505];
int main()
{while(scanf("%s",s)!=EOF){v[1].clear();v[2].clear();int len=strlen(s);v[1].resize(len);for(int j=0; j<len; j++){v[1][len-1-j] = s[j]-'0';}scanf("%s",s);len=strlen(s);v[2].resize(len);for(int j=0; j<len; j++){v[2][len-1-j] = s[j]-'0';}ntt.mul(v[1],v[2],v[1].size()+v[2].size());memset(ans,0,sizeof(ans));for(int i=0; i<v[1].size()*2; i++){if(v[1].size()>i)ans[i]+=v[1][i];if(ans[i]>=10){ans[i+1]+=ans[i]/10;ans[i]%=10;}}int e=0;for(int i=v[1].size()*2-1;i>=0;i--){if(ans[i]){e=i;break;}}for(int i=e;i>=0;i--){printf("%lld",ans[i]);}printf("\n");}return 0;
}

HDU 1402(FFT,NNT)相关推荐

  1. HDU 1402 A * B Problem Plus FFT

    A * B Problem Plus 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1402 Description Calculate A * B. ...

  2. HDU 4609 FFT

    题目大意 给定n条边的边值,求任意取三条边能组成三角形的概率 这里概率 P = valid/tot tot = (n-2)*(n-1)*n/6是没问题的 valid表示合法的方式 先考虑,任意两条边组 ...

  3. HDU 1402——A * B Problem Plus

    题意: 给定a,b,求a*b. 思路: a,b的长度都为50000,直接模拟计算n*m肯定超时,可以用快速傅里叶变化计算,然后再把相应的系数化简出来. code: #include <iostr ...

  4. 3-idiots HDU - 4609 FFT模板

    给N个木棍问任选三个可组合出三角形的概率 以前写的,整理整理存个档 //#pragma comment(linker, "/STACK:1024000000,1024000000" ...

  5. FFT Fast-Fourier-Transform(白话粗口18X) .

    由于受到良心谴责,(用模版AC),所以今日全日搞FFT OTZ 终于搞掂!!!!!!首先自我发泄一下!!!!!!!!!! 连续AC5次先!!!!!!!!!! 以下内容涉及暴力等18X情节,需家长陪同, ...

  6. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  7. 大数乘法(快速傅立叶变换)下

    博客搬家:最爱午后红茶 大数乘法(快速傅立叶变换)上 上篇已经已经讲了多项式乘法由系数表示法转化为点值表示法(即求值)的FFT算法的过程:接下来讲插值算法,它需不需要用新的算法写一遍呢?并不用这么麻烦 ...

  8. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  9. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  10. ACM模块解析之 数论

    数  论 一.简介 数论是ACM中的重点内容.历年竞赛题目,一般都有1~2道题目与数论有密切关系.数论涉及的概念和算法很多,用途也非常广泛.掌握与数论有关的方法,是参赛者需要具备的必要技能.数论的学习 ...

最新文章

  1. mysql需要vc_VC连接MySql
  2. UML学习总结(3)——StarUML指导手册
  3. Android Studio 找不到EventBus/ButterKnife等第三方包解决方案
  4. 数据科学和人工智能技术笔记 三、数据预处理
  5. Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母
  6. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
  7. wine android6,安卓能跑Windows程序,Wine 2.10开发版发布
  8. PyCharm使用opencv错误解决办法:ModuleNotFoundError: No module named 'cv2'/ImportError: DLL load failed
  9. linux中定义用户账户的文件为,Linux中用户和组中认证库和解析库的文件格式以及默认参数定义文件...
  10. Church's Coupon Performance Test Script
  11. 一个悄然崛起的国产软件,太强了!
  12. 题解 JZOJ 1354.土地购买
  13. java stdin怎么用_如何用Java编写ssh的stdin?
  14. win10安装账户卡住_关于解决win10装系统时创建帐户时卡住了的具体解决办法
  15. 基于Netty实现分布式IM即时通讯开发
  16. Oracle数据库常见的增删改查操作语句大全
  17. HashMap 计算key的hash值方法hash()
  18. 有1000桶酒,其中1桶有毒.而一旦吃了,毒性会在1周后发作.现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠.
  19. type=“module“ 你了解,但 type=“importmap“ 你知道吗
  20. 优雅的解决uniapp 页面多个组件调用同一个生命周期时的冲突

热门文章

  1. 手动验证 TLS 证书
  2. 初中计算机软件课后反思,信息技术的教学反思
  3. windows 7 官方旗舰版
  4. matlab画正态分布图简单算法
  5. windows出于安全原因某些设置由系统管理员管理解决方法
  6. 电脑一启动吃鸡就重启计算机,玩吃鸡老是重启电脑
  7. chrome下载的word等文档解除锁定的方法
  8. UIWebView的使用---safri
  9. 会议安排(经典贪心算法例题)
  10. Java程序员进阶书籍 ,看这11本书就够了