QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#140649 | #6399. Classic: Classical Problem | Schi2oid | WA | 18ms | 83548kb | C++14 | 2.7kb | 2023-08-16 15:31:39 | 2023-08-16 15:31:48 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const long double pi=acos(-1);
struct CP{
long double x,y;
CP(long double X=0,long double Y=0) {x=X,y=Y;}
CP operator + (const CP& ano) const { return (CP){x+ano.x,y+ano.y}; }
CP operator - (const CP& ano) const { return (CP){x-ano.x,y-ano.y}; }
CP operator * (const CP& ano) const { return (CP){x*ano.x-y*ano.y,x*ano.y+y*ano.x}; }
};
int n;
int id[800005];
void get_id(){for(int i=1;i<n;i++) id[i]=(id[i>>1]>>1)^((n>>1)*(i&1));}
CP F[800005],G[800005],ret[800005];
void FFT(CP *A,bool op){
get_id();
for(int i=0;i<n;i++) if(id[i]<i) swap(A[id[i]],A[i]);
for(int i=2;i<=n;i<<=1){
CP T_SPIN=CP(cos(2*pi/i),sin(2*pi/i));
if(op) T_SPIN.y=-T_SPIN.y;
for(int j=0;j<n;j+=i){
CP BTB=CP(1,0);
for(int k=j;k<j+i/2;k++){
CP fl=A[k];
A[k]=fl+BTB*A[k+i/2];
A[k+i/2]=fl-BTB*A[k+i/2];
BTB=BTB*T_SPIN;
}
}
}
if(op) for(int i=0;i<n;i++) A[i].x=(int)(A[i].x/n+0.5),A[i].y=0;
}
vector<int>fac;
int qkp(int x,int k,int p){
int ret=1;
while(k){
if(k&1) ret=ret*x%p;
x=x*x%p;
k>>=1;
}
return ret;
}
int I[800005];
int a[800005];
vector<int>ans;
signed main(){
int t,sz,p;
cin>>t;
while(t--){
scanf("%lld%lld",&sz,&p);
n=1;
while(n<=p) n<<=1;
n<<=1;
fac.clear();
for(int i=2;i<=sqrt(p-1);i++) if((p-1)%i==0) fac.push_back(i),fac.push_back((p-1)/i);
int g=0;
for(int i=2;i<p;i++){
int ok=1;
for(int j=0;j<fac.size();j++){
if(qkp(i,fac[j],p)==1){ok=0;break;}
}
if(ok){
g=i;
break;
}
}
I[1]=0;
int tmp=1;
for(int i=1;i<p-1;i++){
tmp=tmp*g%p;
I[tmp]=i;
}
int ok=0;
for(int i=1;i<=sz;i++){
scanf("%lld",&a[i]);
if(a[i]==0) ok=1;
}
if(!ok){
printf("1 1\n0\n");
continue;
}
sort(a+1,a+1+sz);
for(int i=2;i<=sz;i++) a[i]=I[a[i]];
for(int i=0;i<n;i++) F[i]=CP(0,0);
for(int i=2;i<=sz;i++) F[a[i]]=CP(1,0);
FFT(F,0);
int l=1,r=p;
while(l<r){
int mid=l+r+1>>1;
for(int i=0;i<n;i++) G[i]=CP(0,0);
for(int i=1;i<mid;i++) G[p-1-I[i]]=CP(1,0);
FFT(G,0);
for(int i=0;i<n;i++) ret[i]=G[i]*F[i];
FFT(ret,1);
int ok=0;
for(int i=0;i<p-1;i++){
if(ret[i].x+ret[i+p-1].x==mid-1){
ok=1;
break;
}
}
if(ok) l=mid;
else r=mid-1;
}
ans.clear();
for(int i=0;i<n;i++) G[i]=CP(0,0);
for(int i=1;i<r;i++) G[p-1-I[i]]=CP(1,0);
FFT(G,0);
for(int i=0;i<n;i++) ret[i]=G[i]*F[i];
FFT(ret,1);
for(int i=0;i<p-1;i++) if(ret[i].x+ret[i+p-1].x==r-1) ans.push_back(qkp(g,p-1-i,p));
printf("%lld %lld\n",ans.size(),r);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) printf("%lld ",ans[i]);
puts("");
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 18ms
memory: 81732kb
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: 16ms
memory: 83548kb
input:
3 1 2 0 1 2 1 2 2 1 0
output:
1 1 0 1 1 0 1 2 0
result:
wrong answer 1st lines differ - expected: '2 1', found: '1 1'