QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#783643#9651. 又一个欧拉数问题Nesraychan100 ✓1885ms58760kbC++144.8kb2024-11-26 11:09:222024-11-26 11:09:29

Judging History

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

  • [2024-11-26 11:09:29]
  • 评测
  • 测评结果:100
  • 用时:1885ms
  • 内存:58760kb
  • [2024-11-26 11:09:22]
  • 提交

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());
}

Details

Tip: Click on the bar to expand more detailed information

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"