快速高精度乘法C语言fft,P1919 FFT加速高精度乘法

P1919 FFT加速高精度乘法

题意:

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

题解:

对于十进制数我们可以将其转换成

\(a0*10^0+a1*10^1+a2*10^2...an*10^n\)

那么对于两个数,我们就可以求出两个的系数表示后得到a的点乘式和b的点乘式

最后得到的答案就是a和b的多项式的系数,这个问题O(n)扫一遍,

处理一下输出即可

代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long LL;

typedef pair pii;

typedef unsigned long long uLL;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define FIN freopen("input.txt","r",stdin);

#define FON freopen("output.txt","w+",stdout);

#define IO ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<

#define debug2(x,y) cout<

#define debug3(x,y,z) cout<

const int maxn = 1e6 + 5;

const int INF = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const double Pi = acos(-1.0);

LL quick_pow(LL x, LL y) {

LL ans = 1;

while(y) {

if(y & 1) {

ans = ans * x % mod;

} x = x * x % mod;

y >>= 1;

} return ans;

}

struct complex {

double x, y;

complex(double xx = 0, double yy = 0) {

x = xx, y = yy;

}

} a[maxn], b[maxn];

complex operator + (complex a, complex b) {

return complex(a.x + b.x, a.y + b.y);

}

complex operator - (complex a, complex b) {

return complex(a.x - b.x, a.y - b.y);

}

complex operator * (complex a, complex b) {

return complex(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);

}

int n, m;

int l, r[maxn];

int limit = 1;

void fft(complex *A, int type) {

for(int i = 0; i < limit; i++) {

if(i < r[i]) swap(A[i], A[r[i]]);

}

for(int mid = 1; mid < limit; mid <<= 1) {

complex Wn(cos(Pi / mid), type * sin(Pi / mid));

for(int R = mid << 1, j = 0; j < limit; j += R) {

complex w(1, 0);

for(int k = 0; k < mid; k++, w = w * Wn) {

complex x = A[j + k], y = w * A[j + mid + k];

A[j + k] = x + y;

A[j + k + mid] = x - y;

}

}

}

}

int ans[maxn];

char numA[maxn], numB[maxn];

int main() {

#ifndef ONLINE_JUDGE

FIN

#endif

int n;

while(scanf("%d", &n) != EOF) {

scanf("%s %s", numA, numB);

// debug3(n,numA,numB);

int lena = 0;

int lenb = 0;

for(int i = n - 1; i >= 0; i--) {

a[lena++].x = numA[i] - '0';

}

for(int i = n - 1; i >= 0; i--) {

b[lenb++].x = numB[i] - '0';

}

while(limit < n + n) limit <<= 1, l++;

for(int i = 0; i <= limit; i++) {

r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));

}

fft(a, 1);

fft(b, 1);

for(int i = 0; i <= limit; i++) {

a[i] = a[i] * b[i];

}

fft(a, -1);

int tot = 0;

for(int i = 0; i <= limit; i++) {

ans[i] += (int)(a[i].x / limit + 0.5);

if(ans[i] >= 10) {

ans[i + 1] += ans[i] / 10;

ans[i] %= 10;

limit += (i == limit);

}

}

while(!ans[limit] && limit >= 1) limit--;

limit++;

while(--limit >= 0) cout << ans[limit];

}

return 0;

}

SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法

SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...

FFT实现高精度乘法

你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...

BZOJ2179&colon; FFT快速傅立叶 FFT实现高精度乘法

Code: #include #include #include #include

HDU 1402 A &ast; B Problem Plus &lpar;FFT求高精度乘法&rpar;

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

HDU - 1402 A &ast; B Problem Plus &lpar;FFT实现高精度乘法&rpar;

题意:计算A*B,A,B均为长度小于50000的整数. 这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT. A和B ...

高精度乘法&lpar;FFT&rpar;

学会了FFT之后感觉自己征服了世界! 当然是幻觉... 不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果. 一般比较凶残的计数动规题都需要FFT(n<=1e9). 下面是高精度乘法 ...

&lbrack;vijos P1040&rsqb; 高精度乘法

如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...

【PKU1001】Exponentiation(高精度乘法)

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 ...

hdu 1042 N&excl;&lpar;高精度乘法 &plus; 缩进)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...

随机推荐

基于Android的手机APP

文档链接: https://coding.net/u/lingyu512/p/document/git/blob/master/%E7%AC%AC6%E7%BB%84_%E8%BF%9B%E5%87% ...

(BFS)uva2554-Snakes &amp&semi; Ladders

题目地址 不知道究竟是我的代码问题,还是oj出了问题(vjudge上看这道题全都是WA,没有AC的)就连直接用书上的代码都WA. 但还是先放出我这不确定正误的代码,大神路过如果有兴趣可以帮忙看一下. ...

《Java并发编程实战》第十四章 构建自己的同步工具定义 札记

一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer { @GuardeBy( &quo ...

&lbrack;转载&rsqb; HTTP协议状态码详解(HTTP Status Code)

转载自:http://www.cnblogs.com/shanyou/archive/2012/05/06/2486134.html 使用ASP.NET/PHP/JSP 或者javascript都会用 ...

【二十二】mysqli事务处理

事务处理 事务基本原理 如果不开启事务,执行一条sql,马上会持久化数据.可见:默认的mysql对sql语句的执行是自动提交的! 如果开启了事务,就是关闭了自动提交的功能,改成了commit执行自动提 ...

Oracle中使用游标转换数据表中指定字段内容格式&lpar;拼音转数字&rpar;

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

在Pycharm中自动添加时间日期作者等信息

1.按照下面路径以此打开File→→Settings→→Editor→→File and code Templates 右侧找到Python Script,如下图 2.设置相关代码如下 ##!/usr ...

PHP算法学习(7) 双向链表 实现栈

2019年2月25日17:24:34 final class BasicNode { public $index; public $data; public $next = null; public ...

elasticsearch插件一head插件安装详解

elasticsearch-head是一个用来浏览.与Elastic Search簇进行交互的web前端展示插件. elasticsearch-head插件主要用途: elasticsearch主要有 ...

Storm的acker确认机制

Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值