题目就是求一个大数的乘法

这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行

我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 + 3*x^0 (在这里x可以理解成10)

那么两个数字相乘就相当于系数相乘后得到新的系数组合

如153 * 4987 = <3,5,1> * <7,8,9,4>

这相当于卷积的计算,最快的方式就是fft,nlgn的复杂度就能求解,求解得到后再把每一位大于10往前赋值就行了

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h> using namespace std;
const double PI = acos(-1.0); struct complex{
double r , i;
complex(double r= , double i=):r(r),i(i){}
complex operator+(const complex &a) const{
return complex(r+a.r , i+a.i);
}
complex operator-(const complex &a) const{
return complex(r-a.r , i-a.i);
}
complex operator*(const complex &a) const{
return complex(r*a.r-i*a.i , r*a.i+i*a.r);
}
}; void change(complex y[] , int len)
{
int i,j,k;
for(i= , j=len/ ; i<len- ; i++){
if(i<j) swap(y[i],y[j]);
k = len/;
while(j>=k){
j-=k;
k/=;
}
if(j<k) j+=k;
}
} void fft(complex y[] , int len , int on)
{
change(y , len);
for(int i= ; i<=len ; i<<=){
complex wn(cos(-on**PI/i) , sin(-on**PI/i));
for(int j= ; j<len ; j+=i){
complex w(,);
for(int k=j ; k<j+i/ ; k++){
complex u = y[k];
complex t = w*y[k+i/];
y[k] = u+t;
y[k+i/] = u-t;
w = w*wn;
}
}
}
if(on==-)
for(int i= ; i<len ; i++)
y[i].r /= len; } const int MAXN = ;
complex x1[MAXN] , x2[MAXN];
char str1[MAXN] , str2[MAXN];
int sum[MAXN]; int main()
{
while(~scanf("%s%s" , str1 , str2)){
int len1 = strlen(str1) , len2 = strlen(str2);
int len = ;
//fft的计算,由于是倍增的,需要保证是2^k次方,且要大于最后得到的结果的总位数
while(len<len1* || len<len2*) len<<=;
for(int i= ; i<len1 ; i++)
x1[i] = complex(str1[len1--i]-'' , );
for(int i=len1 ; i<len ; i++)
x1[i] = complex( , );
for(int i= ; i<len2 ; i++)
x2[i] = complex(str2[len2--i]-'' , );
for(int i=len2 ; i<len ; i++)
x2[i] = complex( , );
//将当前的组合数的系数值修改成复数坐标系的点值o(nlgn)
fft(x1 , len , );
fft(x2 , len , );
//点值可以o(n)的时间内进行计算
for(int i= ; i<len ; i++)
x1[i] = x1[i]*x2[i];
//将点值重新通过逆过程(又叫dft)转化为系数值
fft(x1 , len , -); memset(sum , , sizeof(sum));
for(int i= ; i<len ; i++) sum[i] = (int)(x1[i].r+0.5);
for(int i= ; i<len ; i++){
sum[i+] += sum[i]/;
sum[i] = sum[i]%;
}
int ansl = len1+len2-;
while(sum[ansl]== && ansl>) ansl--;
for(int i=ansl ; i>= ; i--) printf("%c" , sum[i]+'');
printf("\n");
}
return ;
}

HDU 1402 fft 模板题的更多相关文章

  1. HDU 1402 A * B Problem Plus (FFT模板题)

    FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...

  2. HDU 1402 FFT 大数乘法

    $A * B$ FFT模板题,找到了一个看起来很清爽的模板 /** @Date : 2017-09-19 22:12:08 * @FileName: HDU 1402 FFT 大整数乘法.cpp * ...

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

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

  4. HDU 2138 Miller-Rabin 模板题

    求素数个数. /** @Date : 2017-09-18 23:05:15 * @FileName: HDU 2138 miller-rabin 模板.cpp * @Platform: Window ...

  5. hdu 1402 FFT(模板)

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. UOJ#34 FFT模板题

    写完上一道题才意识到自己没有在博客里丢过FFT的模板-- 这道题就是裸的多项式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人这么写没有T),也可以各种其他分治乘法乱搞-- 所以我就直 ...

  7. HDU 4609 FFT模板

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...

  8. UOJ 34: 多项式乘法(FFT模板题)

    关于FFT 这个博客的讲解超级棒 http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transfor ...

  9. HDU 1392 凸包模板题,求凸包周长

    1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...

随机推荐

  1. [Zend]设置ZendStudio编辑器配色

    首先,菜单栏–help–install new software… 接着,添加一个更新源,就是点击界面的add按钮,在新窗口的location位置输入http://eclipse-color-them ...

  2. s3c2440 移值u-boot-2016.03 第4篇 支持NAND flash 识别

    1, /include/configs/smdk2440.h 中添加 #define CONFIG_CMD_NAND 编译 drivers/mtd/nand/built-in.o: In functi ...

  3. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

  4. Maven单元测试报告及测试覆盖率

     对junit单元测试的报告:类似这样的结果 ------------------------------------------------------- T E S T S ----------- ...

  5. android之电话拨号器

    在android入门的案例中,除了HelloWorld这个经典案例,还有一个电话拨号器需要掌握,现在我就来个电话拨号器的示范,毕竟大牛也是从菜鸟进化而来的. 首先你应该知道自己要设置怎样的UI,然后创 ...

  6. (转) CCEditBox 编辑框

    CCEditBox 编辑框 原文: http://blog.csdn.net/cloud95/article/details/8773470 分类: cocos2d-x 2013-04-08 19:1 ...

  7. [CCF] ISBN号码检测

    CCF ISBN号码检测 题目概述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其 ...

  8. 2015年江西理工大学C语言程序设计竞赛(高级组)

    A 解法:DP+二分 dp[i]=max(dp[i],dp[j]+p[i].v)(i>j) dp[i]表示建立i点之后能够获得的最大值 int n,M; struct node { int l, ...

  9. file以及文件大小转化问题

    android 获取文件夹.文件的大小 以B.KB.MB.GB 为单位             public class FileSizeUtil { public static final int ...

  10. 20个Linux服务器安全强化建议(一)

    Linux服务器安全对于保护用户数据.知识产权非常重要,同时还能减少你面对黑客的时间.在工作中,通常由系统管理员对Linux的安全负责,在这篇文章中,介绍了20条对Linux系统进行强化的建议.本文所 ...