QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#509956 | #3799. It's Surely Complex | Tomato_Fish | WA | 1ms | 5976kb | C++14 | 3.5kb | 2024-08-08 20:09:20 | 2024-08-08 20:09:20 |
Judging History
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'