QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#185714 | #6399. Classic: Classical Problem | UESTC_Guest_WiFi# | WA | 2ms | 20184kb | C++20 | 3.7kb | 2023-09-22 15:40:46 | 2023-09-22 15:40:46 |
Judging History
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'