QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#674612 | #5829. 马戏团里你最忙 | rqoi031 | 100 ✓ | 718ms | 93404kb | C++20 | 9.9kb | 2024-10-25 16:52:21 | 2024-10-25 16:52:21 |
Judging History
answer
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<chrono>
#include<random>
#include<tuple>
typedef unsigned int uint;
typedef unsigned long long ull;
constexpr uint mod{998244353};
constexpr uint plus(const uint &x,const uint &y) {
if(x+y>=mod) {
return x+y-mod;
}
return x+y;
}
constexpr uint minus(const uint &x,const uint &y) {
if(x<y) {
return x-y+mod;
}
return x-y;
}
constexpr uint power(uint x,uint y) {
uint s(1);
while(y>0) {
if(y&1) {
s=ull(s)*x%mod;
}
x=ull(x)*x%mod;
y>>=1;
}
return s;
}
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
template<typename Tp>
inline Tp rand(const Tp &l,const Tp &r) {
return std::uniform_int_distribution<Tp>(l,r)(rng);
}
inline void FWT_or(const uint &n,uint *const f) {
for(uint l=1;l!=n;l<<=1) {
for(uint *i=f;i!=f+n;i+=l<<1) {
for(uint *j=i;j!=i+l;j++) {
*(j+l)=plus(*(j+l),*j);
}
}
}
}
inline void IFWT_or(const uint &n,uint *const f) {
for(uint l=1;l!=n;l<<=1) {
for(uint *i=f;i!=f+n;i+=l<<1) {
for(uint *j=i;j!=i+l;j++) {
*(j+l)=minus(*(j+l),*j);
}
}
}
}
inline void FWT_and(const uint &n,uint *const f) {
for(uint l=1;l!=n;l<<=1) {
for(uint *i=f;i!=f+n;i+=l<<1) {
for(uint *j=i;j!=i+l;j++) {
*j=plus(*j,*(j+l));
}
}
}
}
inline void IFWT_and(const uint &n,uint *const f) {
for(uint l=1;l!=n;l<<=1) {
for(uint *i=f;i!=f+n;i+=l<<1) {
for(uint *j=i;j!=i+l;j++) {
*j=minus(*j,*(j+l));
}
}
}
}
inline uint BM(const uint &n,const uint *const f,uint *const g) {
uint lst[n+1]{},tmp[n+1]{};
uint len(0);
uint lstpos(-1),lstlen(0);
uint lstdel(0);
for(uint i=0;i!=n;i++) {
uint val(0);
for(uint j=1;j<=len;j++) {
val=(val+ull(f[i-j])*g[j])%mod;
}
if(val==f[i]) {
continue;
}
if(lstpos==-1) {
len=i+1;
std::fill(g+1,g+i+2,0);
lstpos=i,lstlen=0;
lstdel=f[i];
continue;
}
const uint del(minus(f[i],val));
const uint coef(ull(del)*power(lstdel,mod-2)%mod);
std::copy(g+1,g+len+1,tmp+1);
for(uint j=1;j<=lstlen;j++) {
g[j+(i-lstpos)]=(g[j+(i-lstpos)]+ull(mod-coef)*lst[j])%mod;
}
g[i-lstpos]=plus(g[i-lstpos],coef);
std::tie(lstlen,len)=std::make_tuple(len,std::max(len,lstlen+(i-lstpos)));
lstpos=i,lstdel=del;
std::copy(tmp+1,tmp+lstlen+1,lst+1);
}
return len;
}
constexpr uint N{8};
uint w[1<<N|1];
constexpr uint getn(const uint &n) {
return 1<<std::__lg(n-1)+1;
}
inline void init() {
w[1<<N]=power(3,mod-1>>N+2);
for(int i=N;i!=0;i--) {
w[1<<i-1]=ull(w[1<<i])*w[1<<i]%mod;
}
w[0]=1;
for(int i=1;i!=1<<N;i++) {
w[i]=ull(w[i&i-1])*w[i&-i]%mod;
}
}
inline void DIF(const uint &n,uint *const f) {
for(uint l=n>>1;l!=0;l>>=1) {
for(uint *i=f,*o=w;i!=f+n;i+=l<<1,o++) {
for(uint *j=i;j!=i+l;j++) {
const uint t(ull(*(j+l))**o%mod);
*(j+l)=minus(*j,t),*j=plus(*j,t);
}
}
}
}
inline void DIT(const uint &n,uint *const f) {
for(uint l=1;l!=n;l<<=1) {
for(uint *i=f,*o=w;i!=f+n;i+=l<<1,o++) {
for(uint *j=i;j!=i+l;j++) {
const uint t(*(j+l));
*(j+l)=ull(*j+mod-t)**o%mod,*j=plus(*j,t);
}
}
}
std::reverse(f+1,f+n);
const uint t(mod-(mod-1>>std::__lg(n)));
for(uint *i=f;i!=f+n;i++) {
*i=ull(*i)*t%mod;
}
}
inline void multiply(const uint &n,uint *const f,uint *const g) {
DIF(n,f),DIF(n,g);
for(uint i=0;i!=n;i++) {
f[i]=ull(f[i])*g[i]%mod;
}
DIT(n,f);
}
inline void multiply(const uint &n,const uint *const f,const uint *const g,uint *const h) {
uint *t(new uint[n]{});
std::copy(f,f+n,h);
std::copy(g,g+n,t);
multiply(n,h,t);
delete[] t;
}
inline void inverse(const uint &n,const uint *const f,uint *const g) {
uint *t0(new uint[n<<1]{}),*t1(new uint[n<<1]{});
t1[0]=power(f[0],mod-2);
for(uint l=1;l!=n;l<<=1) {
std::copy(f,f+(l<<1),t0);
std::fill(t0+(l<<1),t0+(l<<2),0);
DIF(l<<2,t0),DIF(l<<2,t1);
for(uint i=0;i!=l<<2;i++) {
t1[i]=(2+ull(mod-t0[i])*t1[i])%mod*t1[i]%mod;
}
DIT(l<<2,t1);
std::fill(t1+(l<<1),t1+(l<<2),0);
}
std::copy(t1,t1+n,g);
delete[] t0,delete[] t1;
}
inline void add(const std::vector<uint> &f,std::vector<uint> &g) {
if(g.size()<f.size()) {
g.resize(f.size());
}
for(uint i=0;i!=f.size();i++) {
g[i]=plus(g[i],f[i]);
}
}
inline void sub(const std::vector<uint> &f,std::vector<uint> &g) {
if(g.size()<f.size()) {
g.resize(f.size());
}
for(uint i=0;i!=f.size();i++) {
g[i]=minus(g[i],f[i]);
}
}
inline void multiply(const std::vector<uint> &f,const std::vector<uint> &g,std::vector<uint> &h) {
const uint n(f.size()),m(g.size());
if(n==0||m==0) {
return h.clear(),void();
}
const uint k(getn(n+m-1));
uint *t0(new uint[k]{}),*t1(new uint[k]{});
std::copy(f.begin(),f.end(),t0);
std::copy(g.begin(),g.end(),t1);
multiply(k,t0,t1);
h.assign(t0,t0+n+m-1);
delete[] t0,delete[] t1;
}
inline void inverse(const std::vector<uint> &f,std::vector<uint> &g) {
const uint n(f.size()),k(getn(n));
uint *t0(new uint[k<<1]{}),*t1(new uint[k<<1]{});
t1[0]=power(f[0],mod-2);
for(uint l=1;l!=k;l<<=1) {
std::copy(f.begin(),f.begin()+std::min(n,l<<1),t0);
std::fill(t0+std::min(n,l<<1),t0+(l<<2),0);
DIF(l<<2,t0),DIF(l<<2,t1);
for(uint i=0;i!=l<<2;i++) {
t1[i]=(2+ull(mod-t0[i])*t1[i])%mod*t1[i]%mod;
}
DIT(l<<2,t1);
std::fill(t1+(l<<1),t1+(l<<2),0);
}
g.assign(t1,t1+n);
delete[] t0,delete[] t1;
}
inline void divide(const std::vector<uint> &f,const std::vector<uint> &g,std::vector<uint> &h) {
const uint n(f.size()),m(g.size());
if(m>n) {
return h.clear(),void();
}
std::vector<uint> t0(f.rbegin(),f.rend()),t1(g.rbegin(),g.rend());
t1.resize(n-m+1),inverse(t1,t1);
multiply(t0,t1,h),h.resize(n-m+1);
std::reverse(h.begin(),h.end());
}
inline void modulo(const std::vector<uint> &f,const std::vector<uint> &g,std::vector<uint> &h) {
const uint n(f.size()),m(g.size());
if(n<m) {
return h=f,void();
}
divide(f,g,h);
multiply(g,h,h);
h.resize(m-1);
for(uint i=0;i!=m-1;i++) {
h[i]=minus(f[i],h[i]);
}
}
inline void linear_recurrence(const uint &n,const uint *const f,uint *const g,const int &k) {
std::vector<uint> t0,t1,t2,t3;
t0.assign({0,1});
t1.assign({1});
t2.assign(f,f+n+1);
for(int i=k;i;i>>=1) {
if(i&1) {
multiply(t1,t0,t3);
modulo(t3,t2,t1);
}
multiply(t0,t0,t3);
modulo(t3,t2,t0);
}
std::fill(g,g+n,0);
std::copy(t1.begin(),t1.end(),g);
}
uint wt[1<<17|1],coef[1<<17|1];
uint val[2][1<<17|1];
uint f[85][2][1<<17|1],g[2][1<<17|1],h[2][1<<17|1];
uint arr[85],arr1[85],arr2[85],arr3[85];
uint ans[1<<17|1];
int main() {
init();
int n,k,x;uint p;
scanf("%d%u%d%d",&n,&p,&k,&x);
for(int i=0;i!=1<<n;i++) {
scanf("%u",wt+i);
}
const uint p2(power(2,mod-1-n));
for(int i=0;i!=1<<n;i++) {
val[0][i]=ull(p2)*p%mod;
}
FWT_or(1<<n,val[0]);
for(int i=0;i!=1<<n;i++) {
val[1][i]=ull(p2)*(mod+1-p)%mod;
}
FWT_and(1<<n,val[1]);
for(int i=0;i!=1<<n;i++) {
coef[i]=rand<uint>(1,mod-1);
}
std::fill(f[0][0],f[0][0]+(1<<n),0);
std::fill(f[0][1],f[0][1]+(1<<n),0);
f[0][0][x]=1;
for(int i=1;i<=80;i++) {
std::copy(f[i-1][0],f[i-1][0]+(1<<n),g[0]),FWT_or(1<<n,g[0]);
std::copy(f[i-1][1],f[i-1][1]+(1<<n),g[1]),FWT_or(1<<n,g[1]);
for(int j=0;j!=1<<n;j++) {
g[0][j]=ull(g[0][j])*val[0][j]%mod;
g[1][j]=ull(g[1][j])*val[0][j]%mod;
}
IFWT_or(1<<n,g[0]);
IFWT_or(1<<n,g[1]);
std::copy(g[0],g[0]+(1<<n),h[0]);
std::copy(g[1],g[1]+(1<<n),h[1]);
std::copy(f[i-1][0],f[i-1][0]+(1<<n),g[0]),FWT_and(1<<n,g[0]);
std::copy(f[i-1][1],f[i-1][1]+(1<<n),g[1]),FWT_and(1<<n,g[1]);
for(int j=0;j!=1<<n;j++) {
g[0][j]=ull(g[0][j])*val[1][j]%mod;
g[1][j]=ull(g[1][j])*val[1][j]%mod;
}
IFWT_and(1<<n,g[0]);
IFWT_and(1<<n,g[1]);
for(int j=0;j!=1<<n;j++) {
h[0][j]=plus(h[0][j],g[0][j]);
h[1][j]=plus(h[1][j],g[1][j]);
h[1][j]=(h[1][j]+ull(h[0][j])*wt[j])%mod;
}
std::copy(h[0],h[0]+(1<<n),f[i][0]);
std::copy(h[1],h[1]+(1<<n),f[i][1]);
for(int j=0;j!=1<<n;j++) {
arr[i]=(arr[i]+ull(f[i][1][j])*coef[j])%mod;
}
if(i==k) {
for(int j=0;j!=1<<n;j++) {
printf("%u%c",f[i][1][j],j+1==1<<n?'\n':' ');
}
return 0;
}
}
arr[0]=0;
const int len(BM(81,arr,arr1));
for(int i=1;i<=len;i++) {
arr2[len-i]=minus(0,arr1[i]);
}
arr2[len]=1;
linear_recurrence(len,arr2,arr3,k);
std::fill(ans,ans+(1<<n),0);
for(int i=0;i<len;i++) {
for(int j=0;j!=1<<n;j++) {
ans[j]=(ans[j]+ull(f[i][1][j])*arr3[i])%mod;
}
}
for(int j=0;j!=1<<n;j++) {
printf("%u%c",ans[j],j+1==1<<n?'\n':' ');
}
return 0;
}
详细
Pretests
Final Tests
Test #1:
score: 10
Accepted
time: 172ms
memory: 31440kb
input:
17 203635058 20 45197 630927925 367691872 854861811 935381440 972493717 952218952 40627765 901726383 333182690 814058886 114559515 857808755 180823985 448291128 904629758 587362495 553139819 808271094 537555635 876810522 460868754 965863351 816253267 677756972 587551773 48482825 12382358 781942390 2...
output:
196898572 306765528 537213886 127286930 159851023 63717087 706071741 435797240 327471764 154687895 775133161 446884277 355140499 730759144 828313812 358804201 563368151 879077306 777389211 488119012 23523875 414748489 31031626 712027375 508390555 892195537 272674444 65777736 725465806 703671740 8558...
result:
ok 131072 numbers
Test #2:
score: 10
Accepted
time: 185ms
memory: 31736kb
input:
17 55303977 20 32265 494363203 155538370 630883878 512423276 148363202 832624635 801640865 903488980 811127763 249184672 605607782 287932872 764562597 387167720 508436523 263243837 25444512 71537379 602424523 577977303 207298251 640159465 917833936 352635217 315477193 937365223 740930608 774925120 2...
output:
289704320 958498566 842657284 940168022 997881125 862052632 724273322 231206605 305893297 43278691 837297755 633518092 730177995 204277846 437293037 502075979 382748699 327548917 26671944 687820882 479587172 348577818 6544646 912745783 388632361 225651778 270406177 724852774 753829405 290426213 3659...
result:
ok 131072 numbers
Test #3:
score: 10
Accepted
time: 718ms
memory: 92604kb
input:
17 126833065 1000 123430 911917407 121906013 929903588 323429234 139121451 3203442 65035849 409625525 525882288 532577435 971826327 904691827 481756384 47231489 346006246 274441242 584793873 841520735 543444701 644939661 885202827 142653644 180313583 548253835 847010044 216554243 124989074 619408231...
output:
134631343 480699513 849862453 247146759 699748130 715338161 355151478 292751752 86181381 407771588 827284655 803659756 69403105 527593812 231299485 275012392 926452282 230048926 248932928 562168554 952865833 726491930 824516102 652955122 618228742 103751577 43309223 223455183 332063966 84250610 4567...
result:
ok 131072 numbers
Test #4:
score: 10
Accepted
time: 700ms
memory: 91448kb
input:
17 621627241 1000 37306 874709248 739473737 912060934 158833941 971188630 744039312 327912594 702720054 185196283 745584702 903434215 484148979 176610819 222341600 961711994 877263458 352785155 12121832 920590333 736755672 428869475 220835314 277186463 787049344 504919397 134827356 59724693 78120026...
output:
287767112 405924924 863936907 813048216 488495341 760777896 218672231 613011508 100939729 350001545 294832115 941360641 416789535 876909340 200852660 16856124 923319874 175774574 460372770 720910090 806672046 723152383 1499791 143768065 495566120 25220523 157220954 572061879 911190946 581269547 9547...
result:
ok 131072 numbers
Test #5:
score: 10
Accepted
time: 3ms
memory: 65724kb
input:
1 836026557 1000000000 1 89073685 44729188
output:
936822371 494640537
result:
ok 2 number(s): "936822371 494640537"
Test #6:
score: 10
Accepted
time: 0ms
memory: 63672kb
input:
8 729700268 1000000000 44 415083631 759858310 528846926 698375322 811429471 668487195 443858087 600445292 190489246 123673503 530450450 76731586 197623863 866555166 743879064 141858132 642913199 103864508 528442021 931490458 969629325 724240247 392146627 32067149 882745389 980834475 140464044 516308...
output:
830023741 616121060 660911628 638220986 252695004 652606403 123917422 418209485 845655441 750569346 32907787 264930076 953962978 689996424 323420989 513057450 197453167 221143412 79717545 924653624 119845062 512678835 395988191 629025773 355693367 391006251 472355315 383277265 392809151 920109119 59...
result:
ok 256 numbers
Test #7:
score: 10
Accepted
time: 687ms
memory: 93404kb
input:
17 499122177 1000000000 101368 879449681 64374006 2136324 179144921 432405367 443552363 403139437 39083535 353339709 78321779 538844553 158621708 576996457 284607049 353163162 754891442 765538773 579712088 200974213 4059721 644110071 271278034 94792222 726122290 905812908 137101325 873585214 5466611...
output:
76712311 736727498 966914483 448805348 750114858 28897485 753461342 683730774 284755505 348793098 822598660 28004678 14410200 429526723 364387489 948405933 384557716 821776284 767121187 341389443 512949890 25590295 915209327 878995476 76329751 297767711 690108093 378878117 383202047 800122506 251561...
result:
ok 131072 numbers
Test #8:
score: 10
Accepted
time: 693ms
memory: 93068kb
input:
17 73054278 1000000000 103328 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
output:
307343988 473326156 473326156 763878935 473326156 763878935 763878935 46738335 473326156 763878935 763878935 46738335 763878935 46738335 46738335 438303753 473326156 763878935 763878935 46738335 763878935 46738335 46738335 438303753 763878935 46738335 46738335 438303753 46738335 438303753 438303753 ...
result:
ok 131072 numbers
Test #9:
score: 10
Accepted
time: 334ms
memory: 81172kb
input:
16 544826057 1000000000 58181 127333103 438073137 374751329 498443816 423416409 925764567 46036736 110186961 233535448 830000756 676728537 294866428 430284448 424338238 337810871 397978 916371232 246055490 114266106 174763813 816533383 346479346 358334243 10507119 464920585 275232506 870081558 38720...
output:
770450440 38771269 201293058 433444649 474897116 299183217 522132059 603152811 116039172 451175434 911427230 814731843 644404641 621015244 908568610 412934671 829476216 473110428 37797136 221722199 711492820 360181295 381795593 401481063 639255822 4170678 924263451 31028063 83884670 635084912 898232...
result:
ok 65536 numbers
Test #10:
score: 10
Accepted
time: 684ms
memory: 92620kb
input:
17 596529770 1000000000 121733 359584182 80170529 721719197 271156012 552773637 882685657 619483754 39827609 20656366 82444398 478178854 625533821 736267120 37211948 503896746 770716690 554769769 575127167 638367404 541442475 219866908 428643659 649491821 417360007 540021485 514124438 754101213 3068...
output:
421614534 116554773 723738982 42159276 719258896 170212004 364550169 234235698 305553646 637748331 28143263 403791908 155115061 556160305 147943692 21727045 115873314 367011359 831485941 264863840 554693188 873995114 441755686 503586113 897215621 929133656 495767228 476016113 783433620 966017915 835...
result:
ok 131072 numbers
Extra Test:
score: 0
Extra Test Passed