Submission #17731754


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lint = long long;
template<typename T> using V = vector<T>;
template<typename T> using VV = vector<vector<T>>;
#define all(v) (v).begin(),(v).end()
#define siz(v) (ll)(v).size()
//#define rep(i,n) for(ll i=a;i<(ll)(n);++i)
#define rep(i,a,n) for(ll i=a;i<(ll)(n);++i)

/*
#define rep(i,...) for(auto i:range(__VA_ARGS__)) 
inline vector<ll> range(ll n){if(n<=0)return vector<ll>();vector<ll>v(n);iota(all(v),0LL);return v;}
inline vector<ll> range(ll a,ll b){if(b<=a)return vector<ll>();vector<ll>v(b-a);iota(all(v),a);return v;}
*/

/**
 * 
 * @brief 多項式乗算
 * 
 *  
 * mul<double>:
 *  verifed with    :https://atcoder.jp/contests/atc001/tasks/fft_c
 *  submittion      :
 * mul<complex<double>>     :
 * mul<modint<1000000007>>  :
 * 
 */

using D=double;
const D PI=acos(D(-1));
using Pc=complex<D>;

void fft(bool type,V<Pc>& a){
    int n=a.size(),s=0;
    while((1<<s)<n)s++;
    assert((1<<s)==n);
    static V<Pc>ep[30];
    if(!ep[s].size()){
        rep(i,0,n){
            ep[s].push_back(polar<D>(1,i*2*PI/n));
        }
    }
    V<Pc>b(n);
    rep(i,1,s+1){
        int w=1<<(s-i);
        for(int y=0;y<n/2;y+=w){
            Pc now=ep[s][y];
            if(type)now=conj(now);
            rep(x,0,w){
                auto l=a[y<<1|x];
                auto u=now,v=a[y<<1|x|w];
                // auto r=Pc(
                //     u.real()*v.real()-u.imag()*v.imag(),
                //     u.real()*v.imag()+u.imag()*v.real()
                // );
                auto r=u*v;
                b[y|x]=l+r;
                b[y|x|n>>1]=l-r;
            }
        }
        swap(a,b);
    }
}

V<D>mul(const V<D>&a,const V<D>&b){
    int s=a.size(),t=b.size(),lg=0;
    if(!s||!t)return {};
    while((1<<lg)<s+t-1)lg++;
    int n=1<<lg;
    V<Pc>c(n);
    rep(i,0,s)c[i].real(a[i]);
    rep(i,0,t)c[i].imag(b[i]);
    fft(false,c);
    rep(i,0,n/2+1){
        const int j=i?n-i:0;
        c[i]=(c[i]+conj(c[j]))*(c[i]-conj(c[j]))*Pc(0,-.25l);
        if(i!=j)c[j]=conj(c[i]);
    }
    fft(true,c);
    V<D>d(s+t-1);
    rep(i,0,s+t-1){
        d[i]=c[i].real()/D(n);
    }
    return d;
}

int main(){
    lint n;
    cin>>n;
    vector<double>a(n+1),b(n+1);
    rep(i,0,n)cin>>a[i+1]>>b[i+1];
    auto c=mul(a,b);
    rep(i,1,2*n+1){
        cout<<(int)round(c[i])<<endl;
    }
}

Submission Info

Submission Time
Task C - 高速フーリエ変換
User hotman78
Language C++ (GCC 9.2.1)
Score 100
Code Size 2474 Byte
Status AC
Exec Time 347 ms
Memory 17664 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 33
Set Name Test Cases
Sample 00_sample_01
All 00_sample_01, 01_00_01, 01_01_19, 01_02_31, 01_03_22, 01_04_31, 01_05_40, 01_06_15, 01_07_39, 01_08_28, 01_09_30, 01_10_23, 01_11_33, 01_12_11, 01_13_28, 01_14_41, 01_15_26, 01_16_49, 01_17_34, 01_18_02, 01_19_33, 01_20_29, 02_00_51254, 02_01_82431, 02_02_17056, 02_03_34866, 02_04_6779, 02_05_65534, 02_06_65535, 02_07_65536, 02_08_65537, 02_09_65538, 02_10_100000
Case Name Status Exec Time Memory
00_sample_01 AC 6 ms 3968 KiB
01_00_01 AC 2 ms 4080 KiB
01_01_19 AC 2 ms 3996 KiB
01_02_31 AC 2 ms 3900 KiB
01_03_22 AC 2 ms 3928 KiB
01_04_31 AC 2 ms 4028 KiB
01_05_40 AC 3 ms 3924 KiB
01_06_15 AC 2 ms 3816 KiB
01_07_39 AC 2 ms 3936 KiB
01_08_28 AC 2 ms 4032 KiB
01_09_30 AC 3 ms 4084 KiB
01_10_23 AC 3 ms 3952 KiB
01_11_33 AC 2 ms 4080 KiB
01_12_11 AC 3 ms 4076 KiB
01_13_28 AC 2 ms 4080 KiB
01_14_41 AC 2 ms 3976 KiB
01_15_26 AC 2 ms 4004 KiB
01_16_49 AC 2 ms 3980 KiB
01_17_34 AC 3 ms 3948 KiB
01_18_02 AC 2 ms 3924 KiB
01_19_33 AC 2 ms 4056 KiB
01_20_29 AC 2 ms 4032 KiB
02_00_51254 AC 188 ms 10740 KiB
02_01_82431 AC 301 ms 17452 KiB
02_02_17056 AC 70 ms 6936 KiB
02_03_34866 AC 136 ms 10420 KiB
02_04_6779 AC 40 ms 4744 KiB
02_05_65534 AC 231 ms 10912 KiB
02_06_65535 AC 228 ms 10928 KiB
02_07_65536 AC 251 ms 17200 KiB
02_08_65537 AC 246 ms 17164 KiB
02_09_65538 AC 246 ms 17192 KiB
02_10_100000 AC 347 ms 17664 KiB