数论-FFT高精度乘法

NKOJ3071 模板题:求两个整数之积.

FFT 函数里 ty = 1 表示 DFT 运算,ty = -1 表示 IDFT 运算.

 1 #include <stdio.h>
 2 #include <complex>
 3
 4 using namespace std;
 5
 6 typedef complex<double> CP;
 7 typedef long long LL;
 8
 9 const int _N = 300005;
10 const double PI = 3.1415926535897932384626433832795;
11
12 LL rev[_N], Ans[_N];
13 char str1[_N], str2[_N];
14 CP X[_N], Y[_N];
15
16 void GetRev(LL bit)
17 {
18     for (LL i = 0; i < (1<<bit); ++i)
19         rev[i] = (rev[i>>1]>>1) | ((i&1)<<(bit-1));
20     return;
21 }
22
23 void FFT(CP *A, LL n, LL ty)
24 {
25     LL i, k, len;
26     for (i = 0; i < n; ++i)
27         if (i < rev[i]) swap(A[i], A[rev[i]]);
28
29     for (len = 1; len < n; len <<= 1) {
30         CP wn = exp(CP(0, ty*PI/len));
31         for (i = 0; i < n; i += len<<1) {
32             CP wi(1, 0);
33             for (k = i; k < i+len; ++k) {
34                 CP t0 = A[k], t1 = wi*A[k+len];
35                 A[k] = t0+t1, A[k+len] = t0-t1;
36                 wi *= wn;
37             }
38         }
39     }
40     if (ty == -1)
41         for (i = 0; i < n; ++i) A[i] /= n;
42     return;
43 }
44
45 bool Input(LL &len, char *str)
46 {
47     char tt; bool flag = false; int i;
48     while (((tt = getchar()) < ‘0‘ || tt > ‘9‘) && tt != ‘-‘);
49     if (tt == ‘-‘) flag = true, i = -1;
50     else str[0] = tt, i = 0;
51     while ((tt = getchar()) >= ‘0‘ && tt <= ‘9‘) str[++i] = tt;
52     len = i+1;
53     return flag;
54 }
55
56 int main()
57 {
58     LL flag1, flag2, l1, l2, i;
59     flag1 = Input(l1, str1), flag2 = Input(l2, str2);
60 //    printf("\n\n%s %s\n\n %lld %lld\n", str1, str2, l1, l2);
61     LL a = 1, x = 0;
62     while (a < l1+l2-1) a <<= 1, ++x;
63 //    printf("\n\na = %lld, x = %lld\n\n", a, x);
64     for (i = 0; i < l1; ++i) X[i] = (double)(str1[l1-1-i]-‘0‘);
65     for (i = 0; i < l2; ++i) Y[i] = (double)(str2[l2-1-i]-‘0‘);
66     GetRev(x), FFT(X, a, 1), FFT(Y, a, 1);
67     for (i = 0; i < a; ++i) X[i] *= Y[i];
68     FFT(X, a, -1);
69     for (i = 0; i < l1+l2; ++i)
70         Ans[i] += (long long)(X[i].real() + 0.5), Ans[i+1] += Ans[i]/10, Ans[i] %= 10;
71     for (i = l1+l2; i >= 0 && !Ans[i]; --i);
72     if (i == -1) { printf("0\n"); return 0; }
73     if (flag1 ^ flag2) putchar(‘-‘);
74     while (i >= 0) putchar(Ans[i] + ‘0‘), --i;
75     putchar(‘\n‘);
76     return 0;
77 }

题目

P3071【高精度】a*b
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

给你两个正整数a,b,计算它们的乘积。

输入格式

第一行一个正整数a
第二行一个正整数b

输出格式

一行,表示a*b

样例输入

111222333444555666777888999
999888777666555444333222111

样例输出

111209963037098814851876554444456814851901296370456889

提示

a,b分别不超过100000位



来源  感谢nodgd放题并提供数据

原文地址:https://www.cnblogs.com/ghcred/p/8877051.html

时间: 2024-10-13 14:42:41

数论-FFT高精度乘法的相关文章

HDU1402 FFT高精度乘法模板题

#include<bits/stdc++.h> using namespace std; //HDU 1402 求高精度乘法 const double PI = acos(-1.0); //复数结构体 struct Complex { double x,y;//实部和虚部x+yi Complex(double _x = 0.0,double _y = 0.0) { x = _x; y = _y; } Complex operator -(const Complex &b)const {

高精度乘法程序

对于超过20位的数的乘法问题,我们无法使用普通的方法!!!即使是longlong也会超出范围的!像这样的数,我们只能使用高精度的知识利用数组的方法解决问题!对于高精度乘法的问题,其实思路和高精度加法的思路差不多,都需要使用字符数组来存放每次算完的结果!        1  2  3        *4  5  6    ________________      12  15  18   8  10  124  5   6  _____________________4 13   28   27

POJ 1306 Combinations 高精度乘法

题目大意:给出mn,让你求C(m,n). 思路:公式都给你了,就100,暴力就可以关键还是高精度.如果按照算法"它让你怎么做你就怎么做",那么很显然你需要写一个高精度除法.然而可以证明,这个除法是不会产生余数的.所以我们可以数论分析,然后避免高精度除法. 方法就是暴力求每个数的质因数,然后把被除数和除数相同的质因数消去,最后除数肯定会被消没.这样只要做高精度乘法就可以了. CODE: #include <cstdio> #include <cstring> #i

poj1001(高精度乘法)

1.题目表述 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 135893   Accepted: 33256 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation o

真真真&#183;?高精度乘法!!!!!

RX-0奉上哈哈哈哈哈哈哈哈哈哈哈哈哈™™™ 先奉上真真真·高精度乘法源代码: 高精度乘法 RX-0制作最后修改:2016年7月6日#include<stdio.h>#include<string.h>#include<math.h>char s[10000],b;int a[10000];int c[10000];int main(){ int x,l=0,y=1,i,j,m,l1=0; long long s1=0; //freopen("hp.in&qu

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

[vijos P1040] 高精度乘法

如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了,好在我机智,一看到解题里说要压位就自动脑补出压位了. 代码风格非常诡异,弱智题竟然写到2KB我也是醉了. program vijos_p1040; const maxn=10020; var a,b,aa,bb:array[1..maxn] of integer; c:array[1..2*maxn

【PKU1001】Exponentiation(高精度乘法)

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

HDU 1042.N!【高精度乘法】【8月24】

N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Output For each N, output N! in one line. Sample Input 1 2 3 Sample Output 1 2 6 高精度乘法.数组存,每一位存5位数,不然会严重超时.另外,