QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#47999 | #3799. It's Surely Complex | bulijiojiodibuliduo# | WA | 72ms | 46616kb | C++ | 6.0kb | 2022-09-11 02:51:05 | 2022-09-11 02:51:06 |
Judging History
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);
}
Details
Tip: Click on the bar to expand more detailed information
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'