QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#215993 | #3799. It's Surely Complex | ucup-team004# | TL | 0ms | 0kb | C++20 | 3.1kb | 2023-10-15 14:58:43 | 2023-10-15 14:58:44 |
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