QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#690243#3799. It's Surely Complexydzr00000WA 2ms14336kbC++173.4kb2024-10-30 21:12:332024-10-30 21:12:33

Judging History

This is the latest submission verdict.

  • [2024-10-30 21:12:33]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 14336kb
  • [2024-10-30 21:12:33]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
int p;
struct Complex{
    long long rl,im;
    Complex(long long x,long long y):rl(x),im(y){}
    friend inline Complex operator+(const Complex &a,const Complex &b){return {(a.rl+b.rl)%p,(a.im+b.im)%p};}
    friend inline Complex operator-(const Complex &a,const Complex &b){return {(a.rl-b.rl+p)%p,(a.im-b.im+p)%p};}
    friend inline Complex operator*(const Complex &a,const Complex &b){return {(a.rl*b.rl%p-a.im*b.im%p+p)%p,(a.rl*b.im%p+a.im*b.rl%p)%p};}
};
inline Complex iqpow(Complex a,__int128 b)
{
    Complex ans(1,0);
    while(b)
    {
        if(b&1)
            ans=ans*a;
        a=a*a;
        b>>=1;
    }
    return ans;
}
const double PI=acos(-1.0);
complex<double>a[1100001],b[1100001];
int pos[1100001],cnt=0,lim=1;
inline void FFT(complex<double>*num,int typ)
{
	for(int i=0;i<lim;i++)
		if(i<pos[i])
			swap(num[i],num[pos[i]]);
	for(int mid=1;mid<lim;mid<<=1)
	{
		complex<double>Wn(cos(PI/mid),typ*sin(PI/mid));
		int r=mid<<1;
		for(int j=0;j<lim;j+=r)
		{
			complex<double>W(1,0);
			for(int k=0;k<mid;k++,W=W*Wn)
			{
				complex<double>x=num[j+k],y=W*num[j+k+mid];
				num[j+k]=x+y;
				num[j+k+mid]=x-y;
			}
		}
	}
}
int r[1200001],g[1200001],squ[500001];
long long c[500001];
int main(){
    long long n;
    cin>>p>>n;
    Complex Num(1,0);
    for(int i=1;i<p;i++)
        Num=Num*(Complex){i,i};
    Complex Ans(1,0);
    Ans=Ans*iqpow(Num,n/p);
    for(int i=1;i<=n%p;i++)
        Ans=Ans*(Complex){i,i};
    
    for(int i=0;i<p;i++)
        squ[i]=1ll*i*i%p;
    for(int i=0;i<p;i++)
    {
        r[squ[i]]++;
        if(i<=n%p)
            g[squ[i]]++;
    }
    while(lim<(p<<1))
    {
        lim<<=1;
        cnt++;
    }
    for(int i=0;i<lim;i++)
		pos[i]=(pos[i>>1]>>1)|((i&1)<<(cnt-1));
    
    for(int i=0;i<lim;i++)
    {
        a[i].real(g[i]);a[i].imag(0);
        b[i].real(g[i]);b[i].imag(0);
    }
    FFT(a,1);FFT(b,1);
    for(int i=0;i<lim;i++)
        a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<lim;i++)
        a[i]=a[i]/(1.00*lim)+0.5;
    for(int i=0;i<lim;i++)
        c[i%p]+=(long long)a[i].real();
    for(int i=0;i<=n%p;i++)
        c[2*squ[i]%p]--;
    for(int i=0;i<p;i++)
        c[i]/=2;
    for(int i=0;i<p;i++)
        Ans=Ans*iqpow({0,i},c[i]);
    
    for(int i=0;i<lim;i++)
    {
        a[i].real(r[i]);a[i].imag(0);
        b[i].real(g[i]);b[i].imag(0);
    }
    FFT(a,1);FFT(b,1);
    for(int i=0;i<lim;i++)
        a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<lim;i++)
        a[i]=a[i]/(1.00*lim)+0.5;
    for(int i=0;i<lim;i++)
        c[i%p]+=(long long)a[i].real();
    for(int i=0;i<=n%p;i++)
        c[2*squ[i]%p]--;
    for(int i=0;i<p;i++)
        Ans=Ans*iqpow(iqpow({0,i},c[i]),2*(n/p));
    
    for(int i=0;i<lim;i++)
    {
        a[i].real(r[i]);a[i].imag(0);
        b[i].real(r[i]);b[i].imag(0);
    }
    FFT(a,1);FFT(b,1);
    for(int i=0;i<lim;i++)
        a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<lim;i++)
        a[i]=a[i]/(1.00*lim)+0.5;
    for(int i=0;i<lim;i++)
        c[i%p]+=(long long)a[i].real();
    long long d=n/p;
    for(int i=0;i<p;i++)
        Ans=Ans*iqpow(iqpow({0,i},c[i]),(__int128)d*(d-1)/2);
    for(int i=0;i<p;i++)
        c[2*squ[i]%p]--;
    for(int i=0;i<p;i++)
        c[i]/=2;
    for(int i=0;i<p;i++)
        Ans=Ans*iqpow(iqpow({0,i},c[i]),d);

    printf("%lld %lld\n",Ans.rl,Ans.im);

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 14188kb

input:

2 1

output:

1 1

result:

ok single line: '1 1'

Test #2:

score: 0
Accepted
time: 2ms
memory: 14252kb

input:

2 2

output:

1 1

result:

ok single line: '1 1'

Test #3:

score: 0
Accepted
time: 0ms
memory: 14236kb

input:

2 3

output:

0 0

result:

ok single line: '0 0'

Test #4:

score: 0
Accepted
time: 1ms
memory: 14184kb

input:

2 4

output:

0 0

result:

ok single line: '0 0'

Test #5:

score: 0
Accepted
time: 1ms
memory: 12144kb

input:

3 1

output:

2 1

result:

ok single line: '2 1'

Test #6:

score: 0
Accepted
time: 2ms
memory: 14336kb

input:

3 2

output:

2 0

result:

ok single line: '2 0'

Test #7:

score: -100
Wrong Answer
time: 1ms
memory: 12208kb

input:

3 3

output:

0 2

result:

wrong answer 1st lines differ - expected: '1 0', found: '0 2'