QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#509956#3799. It's Surely ComplexTomato_FishWA 1ms5976kbC++143.5kb2024-08-08 20:09:202024-08-08 20:09:20

Judging History

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

  • [2024-08-08 20:09:20]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5976kb
  • [2024-08-08 20:09:20]
  • 提交

answer

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

typedef long double db;
// db acos(db a) {return acos((long double)a);}
// db cos(db a) {return cos((long double)a);}
// db sin(db a) {return sin((long double)a);}

const db pi=acos((db)-1.);
int fft_n;

const int N=3e6+100;

complex<db> omega[N],omega_inv[N];


void FFT_init(int n){
    fft_n=n;
    for(int i=0;i<n;i++)
        omega[i]=complex<db>(cos(2*pi/n*i),sin(2*pi/n*i));
    omega_inv[0]=omega[0];
    for(int i=1;i<n;i++) omega_inv[i]=omega[n-i];
}

void FFT(complex<db> *a,int n,int tp){
    for(int i=1,j=0;i<n-1;i++){
        int k=n;
        do
        {
            j ^= (k>>=1);
        } while (j<k);
        if(i<j) swap(a[i],a[j]);
    }
    for(int k=2,m=fft_n/2;k<=n;k*=2,m/=2)
        for(int i=0;i<n;i+=k)
            for(int j=0;j<k/2;j++){
                auto u=a[i+j],v=(tp>0?omega:omega_inv)[m*j]*a[i+j+k/2];
                a[i+j]=u+v;
                a[i+j+k/2]=u-v;
            }
    if(tp<0) for(int i=0;i<n;i++) {a[i]/=n;}
}

typedef long long ll;
int mi(int x,int t,int mod){
    int d=1;
    while(t){
        if(t%2) d=(ll)d*x%mod;
        x=(ll)x*x%mod;t/=2;
    }
    return d;
}
int ni(int x,int mod) {return mi(x,mod-2,mod);}

complex<db> a[N];
    int p;ll n;

struct com{
    int c1,c2;
    com() {}
    com(int _c1,int _c2) {c1=_c1;c2=_c2;}
};

com operator + (com n1,com n2) {return com((n1.c1+n2.c1)%p,(n1.c2+n2.c2)%p);}
com operator * (com n1,com n2) {return com(((ll)n1.c1*n2.c1-(ll)n1.c2*n2.c2%p+p)%p,((ll)n1.c2*n2.c1+(ll)n1.c1*n2.c2%p)%p);}


__int128 b[N];

void print(__int128 x){
    int sta[110],tot=0;
    while(x) sta[++tot]=x%10,x/=10;
    if(!tot) printf("0");
    else{
        while(tot) putchar(sta[tot]+'0'),tot--;
    }
}

com Mi(com x,ll t){
    com d=com(1,0);
    while(t){
        if(t%2) d=d*x;
        x=x*x;t/=2;
    }
    return d;
}

int main()
{

    scanf("%d%lld",&p,&n);

    // if(n>=p&&p%4==1){
    //     printf("0 0\n");
    //     return 0;
    // }

    // n%=p;

    int maxn=(1<<20);

    for(int i=0;i<p;i++){
        int t=(ll)i*i%p;
        ll tmp=(n/p)+(i<=n%p);
        a[t]=a[t]+complex<db>((db)(tmp%(8*p-8)),0);
    }
    for(int i=1;i<p;i++){
        if(a[i].real()>0.1&&a[p-i].real()>0.1){
            printf("0 0\n");
            return 0;
        }
    }

    // printf("%.10Lf\n",Summ);

    FFT_init(maxn);

    FFT(a,maxn,1);
    for(int i=0;i<maxn;i++) a[i]=a[i]*a[i];
    FFT(a,maxn,-1);

    // printf("%.10Lf\n",a[p].real());

    __int128 Sum=0;int d=1;
    for(int i=0;i<maxn;i++){
        b[i]=((__int128)(a[i].real()+0.5))%(8*p-8);
    }

    for(int i=1;i<p;i++){
        int t=(ll)i*i%p;
        b[2*t]=(b[2*t]-((n/p)+(i<=n%p))%(8*p-8)+(8*p-8))%(8*p-8);
    }

    // b[0]=b[0]-(__int128)(n/p+1)*(n/p+1);

    // for(int i=0;i<2*p;i++) printf("%lld ",b[i]);printf("\n");

    // printf("%lld %lld\n",b[p],b[0]);

    for(int i=1;i<maxn;i++){
        // if(i%4==3) continue;
        // if(i%p==0) continue;
        if(i%p==0&&b[i]) d=0;
        Sum+=(b[i]/2);
        d=(ll)d*mi(i,(b[i]/2)%(p-1),p)%p;
    }


    com Ans;

    if(Sum%4==0) Ans=com(d,0);
    else if(Sum%4==1) Ans=com(0,d);
    else if(Sum%4==2) Ans=com((p-d)%p,0);
    else Ans=com(0,(p-d)%p); 


    // printf("%d %d\n",Ans.c1,Ans.c2);
    // printf("%d %d\n",Ans.c1,Ans.c2);

    for(int i=1;i<p;i++) Ans=Ans*Mi(com(i,i),(n/p)+(i<=n%p));

    printf("%d %d\n",Ans.c1,Ans.c2);

    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 5976kb

input:

2 1

output:

0 0

result:

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