【HDU1402】【FNT版】A * B Problem Plus
Note: the length of each integer will not exceed 50000.
2
1000
2
2000
/*
宋代朱敦儒
《西江月·世事短如春梦》
世事短如春梦,人情薄似秋云。不须计较苦劳心。万事原来有命。
幸遇三杯酒好,况逢一朵花新。片时欢笑且相亲。明日阴晴未定。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <iostream>
#include <string>
#include <ctime>
#define LOCAL
const int MAXN = + ;
const long long MOD = (479ll<<21ll) + ;//费马数论变换的费马素数
long long G = ;//元根
using namespace std;
typedef long long ll;
ll x1[MAXN], x2[MAXN];
ll Inv[MAXN], wn[MAXN];
ll Inv2[MAXN];
char a[MAXN], b[MAXN]; ll pow(ll a, ll b){
if (b == ) return % MOD;
if (b == ) return a % MOD;
ll tmp = pow(a, b / );
if (b % == ) return (tmp * tmp) % MOD;
else return ((tmp * tmp) % MOD * (a % MOD)) % MOD;
}
ll exgcd(ll a, ll b, ll &x, ll &y){
if (b == ){x = 1ll; y = ; return a;}
ll tmp = exgcd(b, a % b, y, x);
y -= x * (a / b);
return tmp;
}
ll inv(ll a, ll p){
ll x, y;
ll tmp = exgcd(a, p, x, y);
return ((x % MOD) + MOD) % MOD;
}
void change(ll *x, int len, int loglen){
for (int i = ; i < len; i++){
int t = i, k = , tmp = loglen;
while (tmp--) {k = (k << ) + (t & ); t >>= ;}
if (k < i) swap(x[i], x[k]);
}
return;
}
void FNT(ll *x, int len, int loglen, int type){
if (type) change(x, len, loglen);
int t;
t = (type ? : ( << loglen));
for (int i = ; i < loglen; i++){
if (!type) t >>= ;
int l = , r = l + t;
while (l < len){
ll a, b;
ll tmp = 1ll, w = wn[t] % MOD;
if (!type) w = Inv[t];
for (int j = l; j < l + t; j++){
if (type){
a = x[j] % MOD;
b = (x[j + t] * (tmp % MOD)) % MOD;
x[j] = (a + b) % MOD;
x[j + t] = ((a - b) % MOD + MOD) % MOD;
}else{
a = (x[j] + x[j + t]) % MOD;
b = ((((x[j] - x[j + t]) % MOD + MOD) % MOD) * tmp) % MOD;
x[j] = a;
x[j + t] = b;
}
tmp = (tmp * w) % MOD;
}
l = r + t;
r = l + t;
}
if (type) t <<= ;
}
if (!type){
change(x, len, loglen);
for (int i = ; i < len; i++) x[i] = (x[i] % MOD * Inv2[len]) % MOD;
}
}
int work(char *a, char *b){
int len1, len2, loglen = ;
len1 = strlen(a);
len2 = strlen(b);
while (( << loglen) < (max(len1, len2) << )) loglen++;
for (int i = ; i < len1; i++) x1[i] = 1ll * (a[i] - '');
for (int i = ; i < len2; i++) x2[i] = 1ll * (b[i] - '');
for (int i = len1; i < (<<loglen); i++) x1[i] = ;
for (int i = len2; i < (<<loglen); i++) x2[i] = ;
FNT(x1, (<<loglen), loglen, );
FNT(x2, (<<loglen), loglen, );
for (int i = ; i < (<<loglen); i++) x1[i] = (x1[i] * x2[i]) % MOD;
FNT(x1, (<<loglen), loglen, ); int len;
ll over, t;
over = ;
len = ;
for (int i = (len1 + len2) - ; i >= ; i--){
t = x1[i] + over;
a[len++] = t % ;
over = t / ;
}
while (over){
a[len++] = over % ;
over /= ;
}
return len;
}
void print(char *t, int len){
for (; len >= && !t[len]; len--);
if (len < ) printf("");
else for (int i = len; i >= ; i--) printf("%c", t[i] + '');
printf("\n");
}
void prepare(){
wn[] = MOD - ;
for (int i = ; i < ; i++){
if (i != && (MOD - ) / (i * ) == (MOD - ) / ((i - ) * )){
wn[i] = wn[i - ];
Inv[i] = Inv[i - ];
}else{
wn[i] = pow(G, (MOD - ) / ( * i));
Inv[i] = inv(wn[i], MOD);
}
Inv2[i] = inv(i, MOD);
}
} int main() {
memset(a, , sizeof(a));
memset(b, , sizeof(b));
prepare();
while (scanf("%s%s", a, b) != EOF){
print(a, work(a, b));
memset(a, , sizeof(a));
memset(b, , sizeof(b));
}
return ;
}
【HDU1402】【FNT版】A * B Problem Plus的更多相关文章
- HDUST-1245 Interpreter(模拟)
1245: Problem E: Interpreter 时间限制: 1 Sec 内存限制: 128 MB提交: 4 解决: 2[提交][状态][讨论版] 题目描述 Problem E: Inte ...
- HNUSTOJ-1253 Babelfish(字典树)
1253: Problem C: Babelfish 时间限制: 1 Sec 内存限制: 128 MB提交: 14 解决: 3[提交][状态][讨论版] 题目描述 Problem C: Babel ...
- FFT/NTT模板 既 HDU1402 A * B Problem Plus
@(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A a ...
- hdu----(1402)A * B Problem Plus(FFT模板)
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【HDU1402】【FFT】A * B Problem Plus
Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to e ...
- HDU 1000 A + B Problem(指针版)
A + B Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU1402 A * B Problem Plus
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 算法Sedgewick第四版-第1章基础-017一约瑟夫问题(Josephus Problem)
/************************************************************************* * * Josephus problem * * ...
- Light oj-1004 - Monkey Banana Problem,数字三角形的变形版~
100 ...
随机推荐
- linux 多线程基础2
6. 名称:: pthread_detach 功能: 使线程进入分离状态. 头文件: #include <pthread.h> 函数原形: int pthread_detach(pthre ...
- 一个简单的DELPHI程序注册码设计 .
当你辛辛苦苦用DELPHI做好了一个你认为十分不错的程序,你是否想把它发布出去成为共享软件呢 做为一个共享软件,注册码肯定是少不了的,你可以通过判断程序是否注册来进行功能,时间或一些其它限制.现在就 ...
- tensorflow 保存变量,
代码: #!usr/bin/env python# coding:utf-8"""这个代码的作用是 通过 tensorflow 来计算 y = 0.3x + 0.1 的线 ...
- 简单了解View是What?
Android UI界面架构 每个Activity包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图.在里面就是熟悉的TitleView和Content ...
- CAS+SSO原理浅谈
http://www.cnblogs.com/yonsin/archive/2009/08/29/1556423.htmlSSO 是一个非常大的主题,我对这个主题有着深深的感受,自从广州 UserGr ...
- [翻译] GVUserDefaults
GVUserDefaults Tired of writing all that code to get and set defaults in NSUserDefaults? Want to hav ...
- FZU 2129 子序列个数 (动态规划)
题意:子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.. ...
- 使用 OpenSSL API 进行安全编程
创建基本的安全连接和非安全连接 Kenneth Ballard ( kenneth.ballard@ptk.org), 自由程序员 Kenneth 是 Peru State College(位于 Pe ...
- 从源码角度理解android动画Interpolator类的使用
做过android动画的人对Interpolator应该不会陌生,这个类主要是用来控制android动画的执行速率,一般情况下,如果我们不设置,动画都不是匀速执行的,系统默认是先加速后减速这样一种动画 ...
- Hibernate 配置派生属性
在持久化类中,有些属性在表中没有对应的字段,可以在映射文件中设置派生属性. 比如在一个订单中有多个商品的价格,但没有计算总的价格,可以在持久化类中增添一个统计总价格的属性,在映射文件中配置一些信息. ...