QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#215993#3799. It's Surely Complexucup-team004#TL 0ms0kbC++203.1kb2023-10-15 14:58:432023-10-15 14:58:44

Judging History

你现在查看的是最新测评结果

  • [2023-10-15 14:58:44]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-10-15 14:58:43]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

const int N=(1<<20)+5;

typedef long long ll;

typedef complex<double> C;
const double PI=acos(-1);


int p;
struct Complex{
    int x,y;
    Complex(int x_=0,int y_=0):x(x_),y(y_){}

    Complex operator + (const Complex&a)const{return Complex((x+a.x)%p,(y+a.y)%p);}
    Complex operator - (const Complex&a)const{return Complex((x-a.x+p)%p,(y-a.y+p)%p);}
    Complex operator * (const Complex&a)const{return Complex(((ll)x*a.x-(ll)y*a.y%p+p)%p,((ll)x*a.y+(ll)y*a.x)%p);}
};

Complex ksm(Complex a,ll b,Complex c=Complex(1,0)){
    for(;b;b/=2,a=a*a)
        if(b&1)c=c*a;
    return c;
}

int rev_[N],n_,lgn_;
C omg_[N],ww_[N];
void FFT_init(int n){
    for(lgn_=0;(1<<lgn_)<=n;++lgn_);n_=1<<lgn_;
    rev_[0]=0;
    for(int i=1;i<n_;++i)
        rev_[i]=(rev_[i>>1]>>1)|((i&1)<<(lgn_-1));
    for(int i=0;i<n_;++i)
        omg_[i]=polar(1.0,2*PI*i/n_);
}

void FFT(C*a,int flag=0){
    for(int i=0;i<n_;++i)
        if(i<rev_[i])
            swap(a[i],a[rev_[i]]);
    for(int i=0;i<lgn_;++i){
        int t=1<<i;
        for(int j=0;j<t;++j)
            ww_[j]=omg_[j<<(lgn_-i-1)];
        for(int j=0;j<n_;j+=t<<1){
            C*f=a+j,*g=a+j+t;
            for(int k=0;k<t;++k){
                C s=g[k]*ww_[k];
                g[k]=f[k]-s;
                f[k]=f[k]+s;
            }
        }
    }
    if(flag){
        reverse(a+1,a+n_);
        for(int i=0;i<n_;++i)
            a[i]/=n_;
    }
}


int find_g(int p){
    for(int i=1;;++i){
        int pw=1;
        for(int j=1;j<p-1;++j){
            pw=(ll)pw*i%p;
            if(pw==1)break;
        }
        if(pw==1)continue;
        return i;
    }
}

ll n;
int id[N],pw[N];
C pf[N],pg[N];
int f[N];


int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>p>>n;
    ll a=n/p,b=n%p;
    int g=find_g(p);
    id[1]=0;
    pw[0]=1;
    for(int i=1;i<p-1;++i){
        pw[i]=(ll)pw[i-1]*g%p;
        id[pw[i]]=i;
    }
    for(int i=1;i<=b;++i)
        pf[id[i]]+=1,pg[p-1-id[i]]+=1;
    FFT_init(2*p);
    FFT(pf);
    
    FFT(pg);
    for(int i=0;i<n_;++i)
        pf[i]*=pg[i];
    FFT(pf,1);
    for(int i=0;i<p-1;++i){
        int s=pf[i].real()+pf[i+p-1].real()+0.5;
        f[pw[i]]=s;
    }

    Complex ans(1,0);
    Complex ans_b(1,0),ans_a(1,0);
    Complex tmp=ksm(Complex(0,1),p);
    for(int i=1;i<p;++i){
        Complex res=ksm(Complex(0,i),p)-Complex(0,i);
        ans_b=ans_b*res;
        ans_b=ans_b*Complex(i,0);
        ans_b=ans_b*Complex(0,i);
        ans_a=ans_a*Complex(i,0);
        ans_a=ans_a*Complex(0,i);
        if(i<=b){
            ans_a=ans_a*res;
            ans=ans*Complex(i,0);
            ans=ans*Complex(0,i);
            ans=ans*ksm(Complex(i,0),b);
        }
        if(i>=p-b)
            ans_a=ans_a*res*tmp;
    }
    ans_a=ksm(ans_a,a);
    ans_b=ksm(ans_b,a);
    ans_b=ksm(ans_b,a);
    for(int i=1;i<p;++i)if(f[i]){
        ans=ans*ksm(Complex(1,i),f[i]);
    }
    ans=ans*ans_a*ans_b;
    cout<<ans.x<<' '<<ans.y<<'\n';
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

input:

2 1

output:


result: