传送门

题目

给出两个n位10进制整数x和y,你需要计算x*y。

输入格式:

第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。

输出格式:

输出一行,即x*y的结果。(注意判断前导0)

数据范围:

n<=60000

分析

将数字倒序读入,即个位数是1次方系数,十位数是2次方系数,以此类推。然后进行朴素的FFT,最后答案同样也倒序输出即可,注意输出地数应截止至2次方系数,因为1次方乘1次方得到的是2次方。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define pi acos(-1.0)
#define ri register int
int n,m,len,r[];
inline int read(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=(x<<)+(x<<)+(s-'');s=getchar();}
return x*f;
}
inline int read2(){
int f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
return (s-'')*f;
}
struct node {
double x,y;
node(){};
node(double a,double b){x=a;y=b;}
}a[],b[];
inline node operator + (const node a,const node b){
return node(a.x+b.x,a.y+b.y);
}
inline node operator - (const node a,const node b){
return node(a.x-b.x,a.y-b.y);
}
inline node operator * (const node a,const node b){
return node(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
inline void fft(node *a,int f){
for(ri i=;i<n;i++)
if(i<r[i])
swap(a[i],a[r[i]]);
for(ri k=;k<n;k<<=){
node wn(cos(pi/k),sin(pi/k)*f);
for(ri i=;i<n;i+=(k<<)){
node w(,),p,q;
for(ri j=;j<k;j++,w=w*wn){
p=a[i+j],q=a[i+j+k]*w;
a[i+j]=p+q,a[i+j+k]=p-q;
}
}
}
if(f==-)
for(ri i=;i<n;i++)
a[i].x=a[i].x/n;
}
int ans[];
int main()
{ n=read();m=n;
a[].x=b[].x=;
for(ri i=n;i>;i--)a[i].x=read2();
for(ri i=m;i>;i--)b[i].x=read2();
m+=n;
for(n=;n<=m;n<<=)len++;
for(ri i=;i<n;i++)r[i]=((r[i>>]>>)|((i&)<<(len-)));
fft(a,),fft(b,);
for(ri i=;i<n;i++)a[i]=a[i]*b[i];
fft(a,-);
for(ri i=;i<=m;i++)ans[i]=(int)(a[i].x+0.5);
for(ri i=;i<=m;i++)
if(ans[i]>=){
ans[i+]+=(ans[i]/);
ans[i]%=;
}
int ok=;
for(ri i=m+;i>;i--){
if(ans[i])ok=;
if(ok)printf("%d",ans[i]);
}
return ;
}

p1919 A*B Problem升级版的更多相关文章

  1. 洛谷 P1919 A*B Problem升级版

    妈妈我终于会\(A*B\ problem\)啦~~ 题目大意: 给你两个正整数 \(a,b\),求\(a*b\) 其中\(a,b\le 10^{1000000}\) 我们只要把多项式\(A(x)=\s ...

  2. 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)

    洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...

  3. luoguP1919 A*B Problem升级版 ntt

    luoguP1919 A*B Problem升级版 链接 luogu 思路 ntt模板题 代码 #include <bits/stdc++.h> #define ll long long ...

  4. Luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶_FFT

    这其实就是一道裸的FFT 核心思想:把两个数拆成两个多项式用FFT相乘,再反序输出 py解法如下: input() print(int(input())*int(input())) 皮一下hihi f ...

  5. 洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目来源 吐槽下P3803都是紫题... 真心好写,本想一遍过的...但是 我真是太菜了... #include<bits/stdc++.h> using namespace std; ; ...

  6. luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...

  7. P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...

  8. 洛谷P1919 【模板】A*B Problem升级版(FFT)

    传送门 话说FFT该不会真的只能用来做这种板子吧…… 我们把两个数字的每一位都看作多项式的系数 然后这就是一个多项式乘法 上FFT就好了 然后去掉前导零 (然而连FFT的板子都背不来orz,而且空间又 ...

  9. 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...

随机推荐

  1. C#Winform之等待窗体

    窗体主要代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  2. 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串

    题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...

  3. composer 更新国内镜像地址

    composer config -g repo.packagist composer https://packagist.phpcomposer.com​

  4. hbase离线定时入库shell脚本-小栗子

    #!/bin/bash #######数据类型(cdr,ims,pc,.ngn_sip)###### dir=*** ############# #原始文件地址 oripath=/bigdata/da ...

  5. UI控件概述

    常见UI控件 UIKit框架提供了非常多功能强大又易用的UI控件,以便于开发者打造出各式各样的App 以下列举一些在开发中常见的UI控件(稍后补上图片示例) 1.UILabel– 文本标签:作用是显示 ...

  6. Docker 镜像篇

    镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器. docker两个跟镜像有关的命令: hello-world - 最小的镜像 hello-world 是 Docker 官 ...

  7. shell 定义变量

    注意定义变量的语法: var="ABC" 等号之间不能有空格,否则会报错

  8. STL+位运算的文件

    1.queue 队列 queue的头文件是<queue>. 定义queue对象的示例代码如: queue<int>q;  队列内存放的是int类型的数 queue<dou ...

  9. 算法(Algorithms)第4版 练习 1.5.3

    id数组和treesize数组变化情况: 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 10 components 9 0 1 2 3 4 5 6 7 8 9 1 1 ...

  10. QT 按键处理 快捷键处理 shift + ctrl

    原味地址:http://www.cnblogs.com/codingmylife/archive/2010/08/30/1812739.html CTRL+Enter发送信息的实现 在现在的即时聊天程 ...