Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*multiply two big number using FFT */
- typedef complex < double > base ;
- const double PI = 2*acos( 0.0 );
- void fft ( vector < base > & a, bool invert ) {
- int n = ( int ) a. size ( ) ;
- for ( int i = 1 , j = 0 ; i < n ; ++ i ) {
- int bit = n >> 1 ;
- for ( ; j >= bit ; bit >>= 1 )
- j -= bit ;
- j += bit ;
- if ( i < j )
- swap ( a [ i ] , a [ j ] ) ;
- }
- for ( int len = 2 ; len <= n ; len <<= 1 ) {
- double ang = 2 * PI / len * ( invert ? - 1 : 1 ) ;
- base wlen ( cos ( ang ) , sin ( ang ) ) ;
- for ( int i = 0 ; i < n ; i += len ) {
- base w ( 1 ) ;
- for ( int j = 0 ; j < len / 2 ; ++ j ) {
- base u = a [ i + j ] , v = a [ i + j + len / 2 ] * w ;
- a [ i + j ] = u + v ;
- a [ i + j + len / 2 ] = u - v ;
- w *= wlen ;
- }
- }
- }
- if ( invert )
- for ( int i = 0 ; i < n ; ++ i )
- a [ i ] /= n ;
- }
- void multiply ( const vector < int > & a, const vector < int > & b, vector < int > & res ) {
- vector < base > fa ( a. begin ( ) , a. end ( ) ) , fb ( b. begin ( ) , b. end ( ) ) ;
- size_t n = 1 ;
- while ( n < max ( a. size ( ) , b. size ( ) ) ) n <<= 1 ;
- n <<= 1 ;
- fa. resize ( n ) , fb. resize ( n ) ;
- fft ( fa, false ) , fft ( fb, false ) ;
- for ( size_t i = 0 ; i < n ; ++ i )
- fa [ i ] *= fb [ i ] ;
- fft ( fa, true ) ;
- res. resize ( n ) ;
- for ( size_t i = 0 ; i < n ; ++ i )
- res [ i ] = int ( fa [ i ] . real ( ) + 0.5 ) ;
- int carry = 0 ;
- for ( size_t i = 0 ; i < n ; ++ i ) {
- res [ i ] += carry ;
- carry = res [ i ] / 10 ;
- res [ i ] %= 10 ;
- }
- }
- int xx[MAX];char s1[MAX],s2[MAX];
- int main(){
- // booster();
- //read("input.txt");
- int t;
- scani(t);
- while(t--){
- vi a,b,res;
- scanf("%s%s",s1,s2);
- int len = strlen(s1);
- for(int i = 0;i<len;i++)a.pb(s1[i]-48);
- len = strlen(s2);
- for(int i = 0;i<len;i++)b.pb(s2[i]-48);
- // for(auto it : b)cout<<it;cout<<endl;
- reverse(all(a));
- reverse(all(b));
- multiply(a,b,res);
- int indx = 0;
- // for(int i = 0;i<res.size();i++)cout<<res[i];cout<<endl;
- reverse(all(res));
- while(indx<res.size()&&res[indx]==0)indx++;
- vi ans;
- for(int i = res.size()-1;i>=indx;i--)ans.pb(res[i]);
- reverse(all(ans));
- if(ans.size()==0)printf("0");
- else
- for(auto it : ans){
- printf("%d",it);
- }
- puts("");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement