例题: HDU 1402
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const double PI = acos(-1.0);
typedef long long LL;
const LL MAXN = (1LL<<17);
const LL P = (479 << 21) + 1;
const LL G = 3;
const LL NUM = 20;
LL wn[NUM];
LL Pow(LL a, LL b, LL m){
LL ans = 1;
a %= m;
while(b){
if(b & 1) ans = ans*a%m;
b>>=1;
a = a*a%m;
}
return ans;
}
void GetWn()
{
for(int i = 0; i < NUM; i++)
{
LL t = 1LL << i;
wn[i] = Pow(G, (P - 1) / t, P);
}
}
void change(LL * y, LL len) {
LL i, j, k;
for (i = 1, j = len / 2; i < len - 1; i++) {
if (i < j) swap(y[i], y[j]);
k = len / 2;
while (j >= k) {
j -= k;
k /= 2;
}
if (j < k) j += k;
}
}
void ntt(LL *y, LL len, LL on) {
change(y, len);
LL id = 0;
for (LL h = 2; h <= len; h <<= 1) {
id++;
for (LL j = 0; j < len; j += h) {
LL w = 1;
for (LL k = j; k < j + h / 2; k++) {
LL u = y[k] % P;
LL t = w * y[k + h / 2] % P;
y[k] = (u + t) % P;
y[k + h / 2] = (u - t + P) % P;
w = w * wn[id] % P;
}
}
}
if(on == -1)
{
for(LL i = 1; i < len / 2; i++)
swap(y[i], y[len - i]);
LL inv = Pow(len, P - 2, P);
for(LL i = 0; i < len; i++)
y[i] = y[i] * inv % P;
}
}
char A[MAXN], B[MAXN];
LL f[MAXN], g[MAXN];
int main()
{
GetWn();
while(~scanf("%s%s",A,B))
{
LL len = 1LL;
LL len1 = strlen(A);
LL len2 = strlen(B);
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
for(LL i=0; i<len1; i++)
f[i] = (A[len1-1-i]-'0');
for(LL i=0; i<len2; i++)
g[i] = (B[len2-1-i]-'0');
while(len<=2*len1 || len<=2*len2)len<<=1LL;
ntt(f, len, 1), ntt(g, len, 1);
for(LL i=0; i<len; i++)
f[i] = f[i] * g[i] % P;
ntt(f, len, -1);
for(LL i=0; i<len; i++){
f[i+1] += f[i] / 10;
f[i] %= 10;
}
LL tmp = 0;
for(LL i=len-1; i>=0; i--)
if(f[i]){
tmp = i;
break;
}
for(LL i=tmp; i>=0; i--)
putchar(f[i]+'0');
puts("");
}
return 0;
}