This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back
#define x first
#define y second
#define pdd pair<double, double>
#define p3d pair<pdd, double>
#define pii pair<int, int>
#define p3i pair<pii, int>
#define pll pair<ll, ll>
#define p3l pair<pll, ll>
#define lseg L, (L+R)/2, N*2+1
#define rseg (L+R)/2+1, R, N*2+2
#define ub upper_bound
#define lb lower_bound
#define p_q priority_queue
#define MN 1000000009
#define fill(a) memset(a, 0x3f3f3f3f, sizeof a)
#define PI acos(-1)
int sz=524288;
#define sq 4
vector<complex<double> > v, w;
complex<double> e[524300];
string s, t;
ll an[524300], p;
double d; int k;
int flip(int X){
int Y=0; for (int l=0; (1 << l)<sz; ++l, X/=2) Y=Y*2+X%2; return Y;
}
vector<complex<double> > fft(vector<complex<double> > V){
vector<complex<double> > ans[2];
ans[0]=vector<complex<double> >(sz);
for (int l=0; l<sz; ++l)
ans[0][l]=V[flip(l)];
complex<double> t;
for (int l=1; l<sz; l*=2){
ans[1]=vector<complex<double> >(sz);
for (int l2=0; l2<sz; l2+=l){
for (int l3=0; l3<l; ++l2, ++l3){
t=ans[0][l2+l]*e[sz/l/2*l3];
ans[1][l2]=ans[0][l2]+t;
ans[1][l2+l]=ans[0][l2]-t;
}
}
ans[0]=ans[1];
}
return ans[0];
}
void con(){
reverse(s.begin(), s.end());
reverse(t.begin(), t.end());
for (int l=0; l<s.size(); l+=sq){
k=0; p=1;
for (int l2=l; l2<min(l+sq, (int)s.size()); ++l2, p*=10) k+=(s[l2]-'0')*p;
v.pb(k);
}
for (int l=0; l<t.size(); l+=sq){
k=0; p=1;
for (int l2=l; l2<min(l+sq, (int)t.size()); ++l2, p*=10) k+=(t[l2]-'0')*p;
w.pb(k);
//cout << k << endl;
}
//cout << v.size() << ' ' << w.size() << endl;
}
int main(){
cin >> s >> t;
cin >> s >> t;
con();
sz=max(v.size(), w.size())*2;
while(sz!=(sz&-sz)) sz++;
for (int l=0; l<sz; ++l) e[l]=complex<double>(cos(2*PI*l/sz), sin(2*PI*l/sz));
while(v.size()<sz) v.pb(complex<double>(0, 0));
while(w.size()<sz) w.pb(complex<double>(0, 0));
v=fft(v); w=fft(w);
for (int l=0; l<sz; ++l){
//v[l]*=w[l];
v[l]=complex<double>(v[l].real()*w[l].real()-v[l].imag()*w[l].imag(),
v[l].real()*w[l].imag()+v[l].imag()*w[l].real());
}
v=fft(v);
for (int l=0; l<sz; ++l) v[l]/=sz;
reverse(v.begin()+1, v.end());
for (int l=0; l<sz; ++l){
an[l]=(ll)(v[l].real()+0.5);
//cout << v[l] << endl;
}
s="";
for (int l=0; l<sz+3; ++l){
if (an[l]<0) continue;
an[l+1]+=an[l]/10000;
an[l]%=10000;
for (int l2=0; l2<4; l2++, an[l]/=10) s+=char(an[l]%10+'0');
}
while(s.size()>1 && s[s.size()-1]<='0') s.erase(s.size()-1);
reverse(s.begin(), s.end());
cout << s;
return 0;
}
Compilation message (stderr)
mul.cpp: In function 'void con()':
mul.cpp:55:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l=0; l<s.size(); l+=sq){
^
mul.cpp:60:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l=0; l<t.size(); l+=sq){
^
mul.cpp: In function 'int main()':
mul.cpp:75:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(v.size()<sz) v.pb(complex<double>(0, 0));
^
mul.cpp:76:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(w.size()<sz) w.pb(complex<double>(0, 0));
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |