QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#47999#3799. It's Surely Complexbulijiojiodibuliduo#WA 72ms46616kbC++6.0kb2022-09-11 02:51:052022-09-11 02:51:06

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-09-11 02:51:06]
  • 评测
  • 测评结果:WA
  • 用时:72ms
  • 内存:46616kb
  • [2022-09-11 02:51:05]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}()); 
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b,ll mod) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head

void gao(int p) {
	for (int x=0;x<p;x++) {
		ll a=1,b=0;
		for (int y=0;y<p;y++) {
			if (x==0&&y==0) continue;
			ll c=(a*x-b*y)%p,d=(a*y+b*x)%p;
			if (c<0) c+=p;
			a=c; b=d;
			//printf("cccc %d %d %lld %lld\n",x,y,a,b);
		}
		printf("cnm %d %d: ",x,p);
		printf("%lld %lld\n",a,b);
	}
}


typedef pair<ll,ll> cd;
ll p,n;
cd ans(1,0);
cd operator *(cd a,cd b) {
	cd c=mp((a.fi*b.fi-a.se*b.se)%p,(a.fi*b.se+a.se*b.fi)%p);
	if (c.fi<0) c.fi+=p;
	return c;
}
cd powmod(cd a,ll b) {
	cd res(1,0);
	for(;b;b>>=1){if(b&1)res=res*a;a=a*a;}
	return res;
}

cd gao1() {
	return cd{(p%4==1)?0:(p-1),0};
}

cd gao2(ll x) {
	if (x==0) {
		if (p%4==1) return cd{p-1,0};
		else return cd{1,0};
	}
	if (p%4==1) {
		return cd{0,0};
	} else {
		return cd{2*x%p,0};
	}
}
cd gao3(ll y) {
	if (y==0) return cd{0,p-1};
	if (p%4==1) {
		return cd{0,0};
	} else {
		return cd{0,(2*p-2*y)%p};
	}
}


// FFT_MAXN = 2^k
// fft_init() to precalc FFT_MAXN-th roots

typedef double db;
const int FFT_MAXN=1<<21,N=FFT_MAXN+10;
const db pi=acos(-1.);
struct cp{
	db a,b;
	cp operator+(const cp&y)const{return (cp){a+y.a,b+y.b};}
	cp operator-(const cp&y)const{return (cp){a-y.a,b-y.b};}
	cp operator*(const cp&y)const{return (cp){a*y.a-b*y.b,a*y.b+b*y.a};}
	cp operator!()const{return (cp){a,-b};};
}nw[FFT_MAXN+1];int bitrev[FFT_MAXN];
void dft(cp*a,int n,int flag=1){
	int d=0;while((1<<d)*n!=FFT_MAXN)d++;
	rep(i,0,n)if(i<(bitrev[i]>>d))swap(a[i],a[bitrev[i]>>d]);
	for (int l=2;l<=n;l<<=1){
		int del=FFT_MAXN/l*flag;
		for (int i=0;i<n;i+=l){
			cp *le=a+i,*ri=a+i+(l>>1),*w=flag==1?nw:nw+FFT_MAXN;
			rep(k,0,l>>1){
				cp ne=*ri**w;
				*ri=*le-ne,*le=*le+ne;
				le++,ri++,w+=del;
			}
		}
	}
	if(flag!=1)rep(i,0,n)a[i].a/=n,a[i].b/=n;
}
void fft_init(){
	int L=0;while((1<<L)!=FFT_MAXN)L++;
	bitrev[0]=0;rep(i,1,FFT_MAXN)bitrev[i]=bitrev[i>>1]>>1|((i&1)<<(L-1));
	nw[0]=nw[FFT_MAXN]=(cp){1,0};
	rep(i,0,FFT_MAXN+1)nw[i]=(cp){cos(2*pi/FFT_MAXN*i),sin(2*pi/FFT_MAXN*i)};	//very slow
}

void convo(db*a,int n,db*b,int m,db*c){
	static cp f[FFT_MAXN>>1],g[FFT_MAXN>>1],t[FFT_MAXN>>1];
	int N=2;while(N<=n+m)N<<=1;
	rep(i,0,N)
		if(i&1){
			f[i>>1].b=(i<=n)?a[i]:0.0;
			g[i>>1].b=(i<=m)?b[i]:0.0;
		}else{
			f[i>>1].a=(i<=n)?a[i]:0.0;
			g[i>>1].a=(i<=m)?b[i]:0.0;
		}
	dft(f,N>>1);dft(g,N>>1);
	int del=FFT_MAXN/(N>>1);
	cp qua=(cp){0,0.25},one=(cp){1,0},four=(cp){4,0},*w=nw;
	rep(i,0,N>>1){
		int j=i?(N>>1)-i:0;
		t[i]=(four*!(f[j]*g[j])-(!f[j]-f[i])*(!g[j]-g[i])*(one+*w))*qua;
		w+=del;
	}
	dft(t,N>>1,-1);
	rep(i,0,n+m+1)c[i]=(i&1)?t[i>>1].a:t[i>>1].b;
}


int D=10,D2=(1<<D)-1;
VI mul(int *a,int *b,int n,int m){// n<=N, 0<=a[i],b[i]<mo
	static cp f[N],g[N],t[N],r[N];
	int nn=2;while(nn<=n+m)nn<<=1;
	int sz=n+m+1;
	rep(i,0,nn){
		f[i]=(i<=n)?(cp){(db)(a[i]>>D),(db)(a[i]&D2)}:(cp){0,0};
		g[i]=(i<=m)?(cp){(db)(b[i]>>D),(db)(b[i]&D2)}:(cp){0,0};
	}
	swap(n,nn);
	dft(f,n,1);dft(g,n,1);
	rep(i,0,n){
		int j=i?n-i:0;
		t[i]=( (f[i]+!f[j])*(!g[j]-g[i]) + (!f[j]-f[i])*(g[i]+!g[j]) )*(cp){0,0.25};
		r[i]=(!f[j]-f[i])*(!g[j]-g[i])*(cp){-0.25,0} + (cp){0,0.25}*(f[i]+!f[j])*(g[i]+!g[j]);
	}
	dft(t,n,-1); dft(r,n,-1);
	VI tmp(n,0);
	rep(i,0,n)tmp[i]=( (ll(t[i].a+0.5)%p<<D) + ll(r[i].a+0.5) + (ll(r[i].b+0.5)%p<<(2*D)) )%p;
	tmp.resize(sz);
	return tmp;
}

VI mul(VI a,VI b) {
	if (min(SZ(a),SZ(b))<=128) {
		static ll tmp[N];
		rep(i,0,SZ(a)+SZ(b)) tmp[i]=0;
		rep(i,0,SZ(a)) rep(j,0,SZ(b)) tmp[i+j]+=(ll)a[i]*b[j];
		VI c(SZ(a)+SZ(b)-1,0);
		rep(i,0,SZ(c)) c[i]=tmp[i]%p;
	}
	return mul(a.data(),b.data(),SZ(a)-1,SZ(b)-1);
}

VI solve(int l,int r) {
	if (l==r) return VI{l,1};
	else {
		int md=(l+r)>>1;
		return mul(solve(l,md),solve(md+1,r));
	}
}

VI ddqz(VI c) {
	c.resize(p);
	int g=-1;
	for (int gg=2;gg<p;gg++) {
		ll d=1;
		bool isg=1;
		for (int j=1;j<p-1;j++) {
			d=d*gg%p;
			//printf("cnm %d %d %d\n",gg,j,d);
			if (d==1) isg=0;
		}
		if (isg) { g=gg; break; }
	}
	assert(g!=-1);
	VI ff(2*p,0),gg(p,0);
	for (int i=0;i<2*p;i++) {
		ff[i]=powmod(g,(ll)i*(i-1)/2,p);
	}
	rep(i,0,p) {
		gg[i]=c[i]*powmod(g,p-1-(ll)i*(i-1)/2%(p-1),p)%p;
	}
	reverse(all(gg));
	VI rr2=mul(ff,gg);
	VI rr(p,0);
	for (int i=0;i<p-1;i++) {
		rr[powmod(g,i,p)]=rr2[i+p-1]*powmod(g,p-1-(ll)i*(i-1)/2%(p-1),p)%p;
	}
	rr[0]=c[0];
	//printf("C : "); for (auto p:c) printf("%d ",p); puts("");
	//printf("r : "); for (auto p:rr) printf("%d ",p); puts("");
	return rr;
}

int main() {
	fft_init();
	scanf("%lld%lld",&p,&n);
	++n;
	if (p==2) {
		if (n==1) puts("1 0");
		else if (n==2||n==3) puts("1 1");
		else puts("0 0");
		return 0;
	}
	ans=ans*powmod(powmod(gao1(),n/p),n/p);
	cd tmp(1,0);
	for (int i=0;i<n%p;i++) {
		tmp=tmp*gao2(i)*gao3(i);
	}
	ans=ans*powmod(tmp,n/p);
	int m=n%p;
	/*printf("%d\n",m);
	for (int i=0;i<m;i++) for (int j=0;j<m;j++) {
		if (i==0&&j==0) continue;
		ans=ans*cd(i,j);
	}*/
	//puts("cnm");
	if (m>0) {
		VI a=solve(0,m-1);
		/*for (auto x:a) {
			printf("%d ",x);
		}
		puts("");*/
		VI ansr(m+1,0),ansi(m+1,0);
		rep(i,0,m+1) {
			if (i%4==0) ansr[i]=a[i];
			else if (i%4==1) ansi[i]=a[i];
			else if (i%4==2) ansr[i]=(p-a[i])%p;
			else ansi[i]=(p-a[i])%p;
		}
		auto f1=ddqz(ansr),f2=ddqz(ansi);
		rep(i,1,m) ans=ans*cd{f1[i],f2[i]};
		rep(i,1,m) ans=ans*cd{i,0};
	}
	printf("%lld %lld\n",ans.fi,ans.se);
}

詳細信息

Test #1:

score: 100
Accepted
time: 59ms
memory: 46616kb

input:

2 1

output:

1 1

result:

ok single line: '1 1'

Test #2:

score: 0
Accepted
time: 56ms
memory: 46452kb

input:

2 2

output:

1 1

result:

ok single line: '1 1'

Test #3:

score: 0
Accepted
time: 72ms
memory: 45636kb

input:

2 3

output:

0 0

result:

ok single line: '0 0'

Test #4:

score: 0
Accepted
time: 51ms
memory: 45164kb

input:

2 4

output:

0 0

result:

ok single line: '0 0'

Test #5:

score: 0
Accepted
time: 67ms
memory: 45144kb

input:

3 1

output:

2 1

result:

ok single line: '2 1'

Test #6:

score: 0
Accepted
time: 63ms
memory: 45120kb

input:

3 2

output:

2 0

result:

ok single line: '2 0'

Test #7:

score: -100
Wrong Answer
time: 63ms
memory: 45752kb

input:

3 3

output:

0 1

result:

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