「BZOJ2179」
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const int mod=479*(1<<21)+1;
const int N = 131100;
char s[N],t[N];
int n,m,l,r[N],c[N],a[N],b[N];
int power(int a,int b){int ans=1;for(;b;b>>=1,a=1LL*a*a%mod)if(b&1)ans=1LL*ans*a%mod;return ans;}
void ntt(int *a, int f) {
for(int i = 0; i < n; i++) if(r[i] > i) swap(a[i], a[r[i]]);//attention
for(int i = 1; i <n; i <<= 1) {
int wn=power(3,(mod-1)/(i*2));
if(f==-1)wn=power(wn,mod-2);
for(int j = 0; j < n; j += (i<<1)) {
int w = 1;
for(int k = 0; k < i; k++, w =1LL*w* wn%mod) {
int x = a[j+k], y = 1LL*w*a[j+k+i]%mod;//attention
a[j+k] = x+y, a[j+k+i] = x-y;
a[j+k]=(a[j+k]%mod+mod)%mod;
a[j+k+i]=(a[j+k+i]%mod+mod)%mod;
}
}
}
if(f==-1)//attention
{
int rev=power(n,mod-2);
rep(i,0,n-1) a[i]=((ll)a[i]*rev)%mod;
}
}
int main() {
scanf("%d%s%s", &m, s, t);
for(int i = 0; i < m; i++) a[i] = s[m-i-1]-'0', b[i] = t[m-i-1]-'0';
for(n = 1, m <<= 1; n < m; n <<= 1) l++;
for(int i = 0; i < n; i++) r[i] = (r[i>>1]>>1)|((i&1)<<(l-1));
ntt(a, 1), ntt(b, 1);
for(int i = 0; i < n; i++) a[i]=1LL*a[i]* b[i]%mod;
ntt(a, -1);
for(int i = 0; i <=m; i++) if(a[i] >= 10) {
a[i+1] += a[i]/10, a[i] %= 10;
if(i==m)m++;
}while(!a[m]) m--;
for(int i = m; i>=0; i--) printf("%d", a[i]);
return 0;
}