QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#185714#6399. Classic: Classical ProblemUESTC_Guest_WiFi#WA 2ms20184kbC++203.7kb2023-09-22 15:40:462023-09-22 15:40:46

Judging History

This is the latest submission verdict.

  • [2023-09-22 15:40:46]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 20184kb
  • [2023-09-22 15:40:46]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int N=1<<19;
const int mod=998244353;
using arr=int[N+5];
using ll=long long;
int add(int x,int y){ return (x+=y)>=mod?x-mod:x; }
int sub(int x,int y){ return (x-=y)<0?x+mod:x; }
int red(int &x){ return x+=x>>31&mod; }
int ksm(ll x,int tp,int s=1){
    for(;tp;x=x*x%mod,tp>>=1) if(tp&1) s=x*s%mod;
    return s;
}
arr g;
void prep(){
    int i;
    g[0]=1; g[N]=ksm(31,1<<21-19);
    for(i=19;i;i--) g[1<<i-1]=1ll*g[1<<i]*g[1<<i]%mod;
    for(i=0;i<N;i++) g[i]=1ll*g[i&i-1]*g[i&-i]%mod;
}
void DIT(arr T,int n){
    int i,*t,*j,*k,v;
    for(i=n>>1;i;i>>=1)
        for(t=g,j=T;j!=T+n;j+=i<<1,++t)
            for(k=j;k!=j+i;++k)
                v=1ll**t*k[i]%mod,red(k[i]=*k-v),red(*k+=v-mod);
}
void DIF(arr T,int n){
    int i,*t,*j,*k,v;
    for(i=1;i<n;i<<=1)
        for(t=g,j=T;j!=T+n;j+=i<<1,++t)
            for(k=j;k!=j+i;++k)
                red(v=*k+k[i]-mod),k[i]=1ll**t*(*k-k[i]+mod)%mod,*k=v;
    reverse(T+1,T+n);
    int iv=mod-(mod-1)/n;
    for(int i=0;i<n;i++) T[i]=1ll*T[i]*iv%mod;
}
void Mult(arr A,arr B,arr C,int n){
    static arr pa,pb;
    int L=1;
    while(L<n) L<<=1;
    for(int i=0;i<L;i++){
        pa[i]=A[i]; pb[i]=B[i];
        // printf("%d ",pa[i]);
    }
    // puts("");
    // for(int i=0;i<L;i++)
    //     printf("%d ",pb[i]);
    // puts("");
    DIT(pa,L); DIT(pb,L);
    for(int i=0;i<L;i++) pa[i]=1ll*pa[i]*pb[i]%mod;
    DIF(pa,L);
    for(int i=0;i<L;i++) C[i]=pa[i];
}
int n,p;
int pg;
int pk[N+5],lg[N+5];
int a[N+5];
arr A;
void getg(){
    vector<int> pd;
    for(int i=2,j=p-1;i<=j;i++)
        if(j%i==0){
            pd.push_back(i);
            while(j%i==0) j/=i;
        }
    for(pg=2;;pg++){
        bool ok=1;
        for(auto d:pd){
            int tp=(p-1)/d,s=1;
            for(int t=pg;tp;tp>>=1,t=1ll*t*t%p)
                if(tp&1) s=1ll*s*t%p;
            if(s==1) ok=0;
        }
        if(ok) break;
    }
    pk[0]=1; lg[1]=0;
    // printf("%d\n",pg);
    for(int i=1;i<p-1;i++){
        pk[i]=1ll*pk[i-1]*pg%p;
        lg[pk[i]]=i;
        // printf("%d\n",pk[i]);
    }
    pk[p-1]=1;
    // for(int i=1;i<p;i++)
    //     printf("%d ",lg[i]);
    // puts("");
}
vector<int> ans;
bool chk(int K,int tp=0){
    static arr B,C;
    int L=p-1;
    // printf("B ");
    B[0]=1;
    for(int i=2;i<K;i++)
        B[L-lg[i]]=1;
    // for(int i=0;i<L;i++)
    //     printf("%d ",B[i]);
    // puts("");
    Mult(A,B,C,L*2);
    // printf("C ");
    // for(int i=0;i<L*2;i++)
    //     printf("%d ",C[i]);
    // puts("");
    bool ok=0;
    for(int i=0;i<L;i++)
        if(C[i]+C[i+L]==K-1){
            if(tp) ans.push_back(pk[p-1-i]);
            ok=1;
        }
    for(int i=1;i<K;i++) B[p-1-lg[i]]=0;
    for(int i=0;i<2*L;i++) C[i]=0;
    return ok;
}
void solve(){
    scanf("%d %d",&n,&p);
    int in0=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]==0) in0=1;
    }
    if(!in0){
        printf("1 1\n0\n");
        return;
    }
    getg();
    for(int i=1;i<=n;i++)
        if(a[i]) A[lg[a[i]]]=1;
    // printf("A: ");
    // for(int i=0;i<p-1;i++)
    //     printf("%d ",A[i]);
    // puts("");
    int l=2,r=n,mid;
    while(l<=r){
        mid=l+r>>1;
        if(chk(mid)) l=mid+1;
        else r=mid-1;
    }
    chk(r,1);
    printf("%d %d\n",ans.size(),r);
    sort(ans.begin(),ans.end());
    for(auto i:ans)
        printf("%d ",i);
    puts("");
    ans.clear();
    for(int i=1;i<=n;i++)
        if(a[i]) A[lg[a[i]]]=0;
}
int main(){
    prep();
    int t; scanf("%d",&t);
    while(t--){
        solve();
    }
    return 0;
}

詳細信息

Test #1:

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

input:

3
2 3
0 2
3 5
2 3 4
3 5
0 2 3

output:

1 2
2 
1 1
0
2 2
2 3 

result:

ok 6 lines

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 20184kb

input:

3
1 2
0
1 2
1
2 2
1 0

output:

1 1
1 
1 1
0
1 2
1 

result:

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