QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#783643 | #9651. 又一个欧拉数问题 | Nesraychan | 100 ✓ | 1885ms | 58760kb | C++14 | 4.8kb | 2024-11-26 11:09:22 | 2024-11-26 11:09:29 |
Judging History
answer
#include<bits/stdc++.h>
#define IL inline
#define reg register
#define mod 998244353
#define N 300300
IL int read()
{
reg int x=0,f=0; reg char ch=getchar();
while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
template<class T>IL T power(reg T x,reg int p){reg T r=1;for(;p;p>>=1,x*=x)if(p&1)r*=x;return r;}
namespace montgo
{
using u64=unsigned long long;
const unsigned pp()
{
reg unsigned pn=mod;
pn*=2-mod*pn,pn*=2-mod*pn,pn*=2-mod*pn,pn*=2-mod*pn;
return pn;
}
const unsigned P=mod,P2=P<<1,r=-pp(),r2=-u64(P)%P;
IL unsigned reduce(reg u64 x){return(x+u64((unsigned)x*r)*P)>>32;}
struct mont
{
unsigned v;
mont()=default;
~mont()=default;
IL mont(unsigned v):v(reduce(u64(v)*r2)){}
IL mont(const mont &rhs):v(rhs.v){}
IL unsigned get(){reg unsigned ret=reduce(v);return ret-(P&-(ret>=P));}
IL mont &operator =(const mont &rhs){return v=rhs.v,*this;}
IL mont operator -(){reg mont ret;return ret.v=(v?P2-v:0),ret;}
IL mont &operator +=(const mont &rhs){return v+=rhs.v-P2,v+=(signed(v)<0?P2:0),*this;}
IL mont &operator -=(const mont &rhs){return v-=rhs.v,v+=(signed(v)<0?P2:0),*this;}
IL mont &operator *=(const mont &rhs){return v=reduce(u64(v)*rhs.v),*this;}
IL mont &operator /=(const mont &rhs){return this->operator*=(power(rhs,P-2));}
IL friend mont operator +(const mont lhs,const mont rhs){return mont(lhs)+=rhs;}
IL friend mont operator -(const mont lhs,const mont rhs){return mont(lhs)-=rhs;}
IL friend mont operator *(const mont lhs,const mont rhs){return mont(lhs)*=rhs;}
};
}
using montgo::mont;
mont fac[N],ifac[N],inv[N];
IL void init(reg int n)
{
fac[0]=ifac[0]=inv[1]=1;
for(reg int i=2;i<=n;++i)inv[i]=inv[mod%i]*mont(mod-mod/i);
for(reg int i=1;i<=n;++i)fac[i]=fac[i-1]*mont(i),ifac[i]=ifac[i-1]*inv[i];
}
namespace NTT
{
mont a[N],G[N+N];
int len,r[N];
IL void prework(reg int n)
{
for(len=1;len<=n;len<<=1);
for(reg int i=0;i<len;++i)a[i]=0,r[i]=r[i>>1]+(i&1)*len>>1;
}
IL void dft(reg mont *f)
{
for(reg int i=0;i<len;++i)if(r[i]>i)std::swap(f[i],f[r[i]]);
mont x,y;
for(reg int k=2,i,j;k<=len;k<<=1)for(i=0;i<len;i+=k)for(j=i;j<i+k/2;++j)
x=f[j],y=f[j+k/2]*G[k+j-i],f[j]=x+y,f[j+k/2]=x-y;
}
IL void idft(reg mont *f)
{
dft(f),std::reverse(f+1,f+len);
reg int inv=mod-(mod-1)/len;
for(reg int i=0;i<len;++i)f[i]*=inv;
}
}
using namespace NTT;
int n,k,full;
mont con[8],f[N][4];
IL int tr(reg int s,reg int x){return s|(x<<k-2);}
mont dp[4][N][4],tmp[4][4][N+N];
void dc(reg int l,reg int r)
{
if(l==r)return;
reg int mid=l+r>>1;
dc(l,mid);
for(reg int s=full,t,i;s--;)for(t=full;t--;)
{
prework(r-l<<1);
for(i=l;i<=mid;++i)a[i-l]=f[i][s];
dft(a);
for(i=0;i<len;++i)a[i]*=tmp[s][t][len+i];
idft(a);
for(i=mid+1;i<=r;++i)f[i][t]+=a[i-l];
}
dc(mid+1,r);
}
main()
{
for(reg int k=2,i;k<N;k<<=1)
{
mont w=power((mont)3,(mod-1)/k);
G[k]=1;
for(i=1;i<k/2;++i)G[k+i]=G[k+i-1]*w;
}
n=read(),k=read(),full=1<<k-2,init(n);
for(reg int i=0;i<full*2;++i)con[i]=read();
f[0][0]=1;
for(reg int i=1,j,s,t;i<=k;++i)for(s=full;s--;)
{
mont w=f[i-1][s];
static mont g[4],ng[4];
for(t=full;t--;)g[t]=0;
reg int nxt=tr(s,0);
g[nxt>>1]=w*(i>=k?con[nxt]:1);
for(j=i;j<=n;++j)
{
for(t=full;t--;)
{
w=g[t];
f[j][t]+=w*ifac[j-i+1];
nxt=tr(t,1);
ng[nxt>>1]+=w*(j>=k-1?con[nxt]:1);
nxt=tr(t,0);
ng[nxt>>1]-=w*(j>=k-1?con[nxt]:1);
}
for(t=full;t--;)g[t]=ng[t],ng[t]=0;
}
}
for(reg int s=full,i,t;s--;)
{
mont w;
static mont g[4],ng[4];
for(t=full;t--;)g[t]=0;
reg int nxt=tr(s,0);
g[nxt>>1]=con[nxt];
for(i=1;i<=n;++i)
{
for(t=full;t--;)
{
w=g[t];
dp[s][i][t]+=w*ifac[i];
nxt=tr(t,1);
ng[nxt>>1]+=w*con[nxt];
nxt=tr(t,0);
ng[nxt>>1]-=w*con[nxt];
}
for(t=full;t--;)g[t]=ng[t],ng[t]=0;
}
}
for(reg int k=2,s,t,i;k<N/2;k<<=1)for(s=full;s--;)for(t=full;t--;)
{
prework(k);
for(i=1;i<=k;++i)a[i]=dp[s][i][t];
dft(a);
for(i=0;i<len;++i)tmp[s][t][len+i]=a[i];
}
dc(k,n);
reg mont ans=0;
for(reg int i=full;i--;)ans+=f[n][i];
printf("%d\n",(ans*fac[n]).get());
}
詳細信息
Subtask #1:
score: 5
Accepted
Test #1:
score: 5
Accepted
time: 153ms
memory: 51612kb
input:
4 4 698120943 122288832 680575548 463848799 156774757 854895700 608223343 677744207
output:
129451994
result:
ok 1 number(s): "129451994"
Test #2:
score: 5
Accepted
time: 157ms
memory: 51476kb
input:
5 4 550891357 916542306 749948554 123704496 62951279 389103312 185283715 952036050
output:
603530316
result:
ok 1 number(s): "603530316"
Test #3:
score: 5
Accepted
time: 156ms
memory: 49236kb
input:
5 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 5
Accepted
time: 158ms
memory: 51392kb
input:
9 4 932794876 983187846 61110015 10089567 242406926 990649413 302889463 707289292
output:
623984278
result:
ok 1 number(s): "623984278"
Test #5:
score: 5
Accepted
time: 155ms
memory: 49832kb
input:
10 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #6:
score: 5
Accepted
time: 159ms
memory: 50384kb
input:
7 4 75656923 89231235 268411832 331473274 613621490 724088841 938061331 436247598
output:
828280933
result:
ok 1 number(s): "828280933"
Subtask #2:
score: 10
Accepted
Dependency #1:
100%
Accepted
Test #7:
score: 10
Accepted
time: 157ms
memory: 51396kb
input:
17 4 502378168 0 899256313 98988040 502378168 899256313 495866185 403390128
output:
955634034
result:
ok 1 number(s): "955634034"
Test #8:
score: 10
Accepted
time: 162ms
memory: 51264kb
input:
12 4 973896694 511296006 0 486948347 0 0 486948347 511296006
output:
717853738
result:
ok 1 number(s): "717853738"
Test #9:
score: 10
Accepted
time: 150ms
memory: 51348kb
input:
19 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #10:
score: 10
Accepted
time: 157ms
memory: 51280kb
input:
11 4 419369069 674825741 201692543 290396938 869076983 225876646 409445596 934556751
output:
579300967
result:
ok 1 number(s): "579300967"
Test #11:
score: 10
Accepted
time: 151ms
memory: 51336kb
input:
16 4 399991278 671519396 535203044 718737955 71028311 806731162 326724957 940847965
output:
842945071
result:
ok 1 number(s): "842945071"
Test #12:
score: 10
Accepted
time: 159ms
memory: 51344kb
input:
17 4 836771329 338008804 131570815 515413785 262236691 408466186 362787701 152542617
output:
293433305
result:
ok 1 number(s): "293433305"
Subtask #3:
score: 5
Accepted
Test #13:
score: 5
Accepted
time: 10ms
memory: 17672kb
input:
2 2 0 0
output:
0
result:
ok 1 number(s): "0"
Test #14:
score: 5
Accepted
time: 13ms
memory: 17908kb
input:
3 2 0 142044554
output:
704013496
result:
ok 1 number(s): "704013496"
Test #15:
score: 5
Accepted
time: 9ms
memory: 17040kb
input:
4 2 0 0
output:
0
result:
ok 1 number(s): "0"
Test #16:
score: 5
Accepted
time: 13ms
memory: 17344kb
input:
5 2 0 0
output:
0
result:
ok 1 number(s): "0"
Test #17:
score: 5
Accepted
time: 116ms
memory: 20244kb
input:
99487 2 0 0
output:
0
result:
ok 1 number(s): "0"
Test #18:
score: 5
Accepted
time: 123ms
memory: 20612kb
input:
99738 2 693173587 283412622
output:
815899210
result:
ok 1 number(s): "815899210"
Subtask #4:
score: 10
Accepted
Test #19:
score: 10
Accepted
time: 45ms
memory: 25988kb
input:
3 3 977925087 204858071 813705548 204858071
output:
225177337
result:
ok 1 number(s): "225177337"
Test #20:
score: 10
Accepted
time: 43ms
memory: 26396kb
input:
4 3 455457192 542787161 728591379 0
output:
494572650
result:
ok 1 number(s): "494572650"
Test #21:
score: 10
Accepted
time: 43ms
memory: 25216kb
input:
5 3 280102847 175353772 822890581 718141506
output:
0
result:
ok 1 number(s): "0"
Test #22:
score: 10
Accepted
time: 40ms
memory: 25016kb
input:
93 3 517938077 480306276 173009841 0
output:
132737095
result:
ok 1 number(s): "132737095"
Test #23:
score: 10
Accepted
time: 41ms
memory: 27724kb
input:
85 3 812966373 8069068 241411799 241442405
output:
835292882
result:
ok 1 number(s): "835292882"
Test #24:
score: 10
Accepted
time: 39ms
memory: 24672kb
input:
93 3 740309863 562024812 723775833 67304547
output:
79626905
result:
ok 1 number(s): "79626905"
Subtask #5:
score: 10
Accepted
Dependency #4:
100%
Accepted
Test #25:
score: 10
Accepted
time: 51ms
memory: 25088kb
input:
3204 3 390926493 321900190 164112702 172373440
output:
25228045
result:
ok 1 number(s): "25228045"
Test #26:
score: 10
Accepted
time: 40ms
memory: 26084kb
input:
118 3 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #27:
score: 10
Accepted
time: 44ms
memory: 25456kb
input:
1812 3 743708154 0 458364972 539879381
output:
369996118
result:
ok 1 number(s): "369996118"
Test #28:
score: 10
Accepted
time: 48ms
memory: 25904kb
input:
3997 3 506494422 310846999 0 0
output:
180977771
result:
ok 1 number(s): "180977771"
Test #29:
score: 10
Accepted
time: 48ms
memory: 24924kb
input:
3919 3 850826367 581870616 262788170 385598679
output:
718155036
result:
ok 1 number(s): "718155036"
Test #30:
score: 10
Accepted
time: 45ms
memory: 26380kb
input:
3908 3 268833736 15860337 13324648 101653332
output:
307317750
result:
ok 1 number(s): "307317750"
Subtask #6:
score: 15
Accepted
Dependency #5:
100%
Accepted
Test #31:
score: 15
Accepted
time: 122ms
memory: 27548kb
input:
27617 3 649538421 649538421 697411864 348705932
output:
147599656
result:
ok 1 number(s): "147599656"
Test #32:
score: 15
Accepted
time: 129ms
memory: 26936kb
input:
32594 3 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #33:
score: 15
Accepted
time: 126ms
memory: 27248kb
input:
18203 3 971232001 436685091 53582375 579077060
output:
15944343
result:
ok 1 number(s): "15944343"
Test #34:
score: 15
Accepted
time: 224ms
memory: 29276kb
input:
39024 3 761026701 107837672 107837672 129379980
output:
733762036
result:
ok 1 number(s): "733762036"
Test #35:
score: 15
Accepted
time: 226ms
memory: 29204kb
input:
39934 3 860432642 218393709 0 137811711
output:
959310258
result:
ok 1 number(s): "959310258"
Test #36:
score: 15
Accepted
time: 222ms
memory: 27752kb
input:
39441 3 647870660 428771613 299764381 537645434
output:
403002156
result:
ok 1 number(s): "403002156"
Subtask #7:
score: 5
Accepted
Dependency #6:
100%
Accepted
Test #37:
score: 5
Accepted
time: 402ms
memory: 28872kb
input:
65961 3 573372243 470586592 899656037 952529871
output:
727883299
result:
ok 1 number(s): "727883299"
Test #38:
score: 5
Accepted
time: 458ms
memory: 28204kb
input:
95856 3 657353865 0 340890488 0
output:
443504623
result:
ok 1 number(s): "443504623"
Test #39:
score: 5
Accepted
time: 229ms
memory: 29352kb
input:
43044 3 735177548 164240636 263066805 263066805
output:
357165044
result:
ok 1 number(s): "357165044"
Test #40:
score: 5
Accepted
time: 465ms
memory: 30492kb
input:
99124 3 0 626743689 688853562 309390791
output:
488790683
result:
ok 1 number(s): "488790683"
Test #41:
score: 5
Accepted
time: 461ms
memory: 30420kb
input:
99895 3 599127905 0 269443581 399116448
output:
308060904
result:
ok 1 number(s): "308060904"
Test #42:
score: 5
Accepted
time: 461ms
memory: 30404kb
input:
99441 3 81228584 583326742 103263243 128429203
output:
142331215
result:
ok 1 number(s): "142331215"
Subtask #8:
score: 10
Accepted
Dependency #2:
100%
Accepted
Test #43:
score: 10
Accepted
time: 146ms
memory: 51328kb
input:
4 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #44:
score: 10
Accepted
time: 154ms
memory: 51244kb
input:
5 4 719850794 868458999 534771757 496641034 108328567 58126453 451622145 127965210
output:
199502123
result:
ok 1 number(s): "199502123"
Test #45:
score: 10
Accepted
time: 164ms
memory: 51348kb
input:
1620 4 575012072 993907457 465640749 414558489 536940500 884536134 536940500 579348968
output:
276727543
result:
ok 1 number(s): "276727543"
Test #46:
score: 10
Accepted
time: 176ms
memory: 51408kb
input:
2000 4 583522935 653359292 238637874 720209712 120795105 906170921 202280741 436530633
output:
247950749
result:
ok 1 number(s): "247950749"
Test #47:
score: 10
Accepted
time: 176ms
memory: 51396kb
input:
1903 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #48:
score: 10
Accepted
time: 176ms
memory: 51532kb
input:
1970 4 634852705 681848099 480528749 96325370 426074420 662814695 282626889 407588785
output:
358841946
result:
ok 1 number(s): "358841946"
Subtask #9:
score: 10
Accepted
Dependency #8:
100%
Accepted
Test #49:
score: 10
Accepted
time: 859ms
memory: 55552kb
input:
35788 4 137592553 167362125 666174864 893867308 935259273 409053348 908484962 421828880
output:
317183526
result:
ok 1 number(s): "317183526"
Test #50:
score: 10
Accepted
time: 307ms
memory: 52220kb
input:
13180 4 455644004 629655674 433939914 99482062 167912374 215744296 744048010 856909532
output:
724269763
result:
ok 1 number(s): "724269763"
Test #51:
score: 10
Accepted
time: 505ms
memory: 52948kb
input:
25810 4 50511582 266090813 782665122 316602395 681641958 25053907 922678864 732153540
output:
316456760
result:
ok 1 number(s): "316456760"
Test #52:
score: 10
Accepted
time: 891ms
memory: 53896kb
input:
39626 4 0 0 0 0 0 0 0 0
output:
0
result:
ok 1 number(s): "0"
Test #53:
score: 10
Accepted
time: 898ms
memory: 53872kb
input:
39520 4 304751689 247786932 175360249 662006566 300713484 967876352 912150432 961654612
output:
581564252
result:
ok 1 number(s): "581564252"
Test #54:
score: 10
Accepted
time: 887ms
memory: 54004kb
input:
39654 4 199691859 32920622 161790938 562758769 16726982 895821371 135168521 518536619
output:
389091873
result:
ok 1 number(s): "389091873"
Subtask #10:
score: 20
Accepted
Dependency #9:
100%
Accepted
Test #55:
score: 20
Accepted
time: 1751ms
memory: 56024kb
input:
70610 4 68292738 168290466 829953887 829953887 168290466 929951615 99997728 829953887
output:
139356701
result:
ok 1 number(s): "139356701"
Test #56:
score: 20
Accepted
time: 1885ms
memory: 57004kb
input:
83154 4 40222982 0 40222982 40222982 958021371 0 877575407 0
output:
810635777
result:
ok 1 number(s): "810635777"
Test #57:
score: 20
Accepted
time: 913ms
memory: 54680kb
input:
50832 4 105333371 857557033 892910982 260281951 843295773 154948580 892910982 892910982
output:
241653357
result:
ok 1 number(s): "241653357"
Test #58:
score: 20
Accepted
time: 1838ms
memory: 58760kb
input:
99201 4 259092713 0 0 811163900 446173166 552071187 739151640 187080453
output:
150187101
result:
ok 1 number(s): "150187101"
Test #59:
score: 20
Accepted
time: 1830ms
memory: 57520kb
input:
99797 4 367311954 251136106 555832002 724805462 945161134 244359464 684015618 92172056
output:
25758638
result:
ok 1 number(s): "25758638"
Test #60:
score: 20
Accepted
time: 1837ms
memory: 58508kb
input:
99065 4 671004682 687177570 888521328 363461538 143576590 52815535 910840671 989086834
output:
379711332
result:
ok 1 number(s): "379711332"