QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#547296#8211. Enumerating Substringsrqoi031AC ✓19ms5548kbC++202.4kb2024-09-04 20:16:032024-09-04 20:16:05

Judging History

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

  • [2024-09-04 20:16:05]
  • 评测
  • 测评结果:AC
  • 用时:19ms
  • 内存:5548kb
  • [2024-09-04 20:16:03]
  • 提交

answer

#include<stdio.h>
#include<algorithm>
typedef unsigned int uint;
typedef unsigned long long ull;
constexpr uint mod{1000000007};
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;
}
uint inv[2005],invk[4005];
uint fac[2005],ifac[2005],ifac2[2005];
uint powk[1000005];
int main() {
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    if(k<<1<m) {
        return puts("0"),0;
    }
    inv[0]=0,inv[1]=1;
    for(int i=2;i<=m;i++) {
        const int j(mod/i+1);
        inv[i]=ull(j)*inv[i*j-mod]%mod;
    }
    for(int i=0;i<=m<<1&&i<=k;i++) {
        invk[i]=power(k-i,mod-2);
    }
    fac[0]=1;
    for(int i=1;i<=m;i++) {
        fac[i]=ull(fac[i-1])*i%mod;
    }
    ifac[m]=power(fac[m],mod-2);
    for(int i=m;i>=1;i--) {
        ifac[i-1]=ull(ifac[i])*i%mod;
    }
    for(int i=0;i<=m;i++) {
        ifac2[i]=ull(ifac[i])*ifac[i]%mod;
    }
    powk[0]=1;
    for(int i=1;i<=n;i++) {
        powk[i]=ull(powk[i-1])*k%mod;
    }
    const auto calc([&](const int &m,const int &k,const int &d)->uint {
        int i(std::max(0,m-k));
        if(i>k||i<<1>m) {
            return 0;
        }
        uint res(0),coef(1);
        for(int j=0;j!=m-(i<<1);j++) {
            coef=ull(coef)*(k-i-j)%mod;
        }
        for(int j=0;j!=i;j++) {
            coef=ull(coef)*(k-j)%mod*power(2,mod-2)%mod;
        }
        for(;i<=k&&i<<1<=m;i++) {
            res=(res+ull(coef)*ifac[i]%mod*ifac[m-(i<<1)])%mod;
            coef=ull(coef)*(k-i)%mod*invk[d+i]%mod*invk[d+m-i-1]%mod*power(2,mod-2)%mod;
        }
        res=ull(res)*fac[m]%mod;
        return res;
    });
    uint ans(0);
    uint coef(1),sum(calc(m,k,0));
    for(int i=1;i<<1<=m;i++) {
        coef=ull(coef)*(k-i+1)%mod;
        const uint cnt(ull(coef)*(calc(m-(i<<1),k-i,i))%mod);
        sum=minus(sum,cnt);
        uint tmp(0);
        for(int j=0,l=m;l<=n;j^=1,l+=m-i) {
            tmp=(tmp+ull(j?mod-(n-l+1):n-l+1)*powk[n-l])%mod;
        }
        ans=(ans+ull(cnt)*tmp)%mod;
    }
    ans=(ans+ull(sum)*(n-m+1)%mod*powk[n-m])%mod;
    printf("%u\n",ans);
    return 0;
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 1632kb

input:

4 2 3

output:

228

result:

ok 1 number(s): "228"

Test #2:

score: 0
Accepted
time: 19ms
memory: 5548kb

input:

999999 1999 12345678

output:

52352722

result:

ok 1 number(s): "52352722"

Test #3:

score: 0
Accepted
time: 0ms
memory: 1620kb

input:

7 4 2

output:

182

result:

ok 1 number(s): "182"

Test #4:

score: 0
Accepted
time: 0ms
memory: 1660kb

input:

4 3 4

output:

480

result:

ok 1 number(s): "480"

Test #5:

score: 0
Accepted
time: 0ms
memory: 1656kb

input:

3 1 1

output:

3

result:

ok 1 number(s): "3"

Test #6:

score: 0
Accepted
time: 0ms
memory: 1344kb

input:

5 5 1

output:

0

result:

ok 1 number(s): "0"

Test #7:

score: 0
Accepted
time: 0ms
memory: 1560kb

input:

7 4 3

output:

5784

result:

ok 1 number(s): "5784"

Test #8:

score: 0
Accepted
time: 0ms
memory: 1556kb

input:

5 2 4

output:

3932

result:

ok 1 number(s): "3932"

Test #9:

score: 0
Accepted
time: 0ms
memory: 1664kb

input:

8 2 2

output:

1522

result:

ok 1 number(s): "1522"

Test #10:

score: 0
Accepted
time: 0ms
memory: 1632kb

input:

8 1 2

output:

2048

result:

ok 1 number(s): "2048"

Test #11:

score: 0
Accepted
time: 0ms
memory: 1620kb

input:

7 5 3

output:

2430

result:

ok 1 number(s): "2430"

Test #12:

score: 0
Accepted
time: 0ms
memory: 1600kb

input:

10 4 3

output:

272004

result:

ok 1 number(s): "272004"

Test #13:

score: 0
Accepted
time: 0ms
memory: 1472kb

input:

675978 614 2

output:

0

result:

ok 1 number(s): "0"

Test #14:

score: 0
Accepted
time: 0ms
memory: 1440kb

input:

244613 38 1

output:

0

result:

ok 1 number(s): "0"

Test #15:

score: 0
Accepted
time: 0ms
memory: 1392kb

input:

186293 1462 1

output:

0

result:

ok 1 number(s): "0"

Test #16:

score: 0
Accepted
time: 0ms
memory: 1496kb

input:

24867 886 1

output:

0

result:

ok 1 number(s): "0"

Test #17:

score: 0
Accepted
time: 0ms
memory: 1508kb

input:

976164 1014 2

output:

0

result:

ok 1 number(s): "0"

Test #18:

score: 0
Accepted
time: 1ms
memory: 2352kb

input:

179356 2 716844809

output:

577866092

result:

ok 1 number(s): "577866092"

Test #19:

score: 0
Accepted
time: 0ms
memory: 5408kb

input:

621001 130 310625363

output:

892869197

result:

ok 1 number(s): "892869197"

Test #20:

score: 0
Accepted
time: 3ms
memory: 4944kb

input:

678862 850 754662812

output:

582264789

result:

ok 1 number(s): "582264789"

Test #21:

score: 0
Accepted
time: 7ms
memory: 4400kb

input:

650845 978 348443366

output:

825425732

result:

ok 1 number(s): "825425732"

Test #22:

score: 0
Accepted
time: 5ms
memory: 4564kb

input:

669914 402 87448112

output:

318098088

result:

ok 1 number(s): "318098088"

Test #23:

score: 0
Accepted
time: 8ms
memory: 5536kb

input:

998593 530 681228665

output:

408255654

result:

ok 1 number(s): "408255654"

Test #24:

score: 0
Accepted
time: 14ms
memory: 4808kb

input:

369361 1954 125266115

output:

509912384

result:

ok 1 number(s): "509912384"

Test #25:

score: 0
Accepted
time: 12ms
memory: 5404kb

input:

900226 1378 424079373

output:

406320917

result:

ok 1 number(s): "406320917"

Test #26:

score: 0
Accepted
time: 9ms
memory: 2956kb

input:

334887 1506 17859926

output:

503264679

result:

ok 1 number(s): "503264679"

Test #27:

score: 0
Accepted
time: 7ms
memory: 5296kb

input:

936048 544 53978328

output:

548647866

result:

ok 1 number(s): "548647866"

Test #28:

score: 0
Accepted
time: 6ms
memory: 2228kb

input:

152789 1264 792983073

output:

839541707

result:

ok 1 number(s): "839541707"

Test #29:

score: 0
Accepted
time: 10ms
memory: 4424kb

input:

714493 1392 91796331

output:

721071046

result:

ok 1 number(s): "721071046"

Test #30:

score: 0
Accepted
time: 2ms
memory: 4544kb

input:

269571 816 830801077

output:

330064211

result:

ok 1 number(s): "330064211"

Test #31:

score: 0
Accepted
time: 9ms
memory: 5536kb

input:

845120 944 424581630

output:

348960190

result:

ok 1 number(s): "348960190"

Test #32:

score: 0
Accepted
time: 4ms
memory: 4608kb

input:

533990 368 163586376

output:

522092095

result:

ok 1 number(s): "522092095"

Test #33:

score: 0
Accepted
time: 10ms
memory: 2400kb

input:

181707 1792 462399634

output:

373795106

result:

ok 1 number(s): "373795106"

Test #34:

score: 0
Accepted
time: 13ms
memory: 4084kb

input:

417349 1920 761212891

output:

587051329

result:

ok 1 number(s): "587051329"

Test #35:

score: 0
Accepted
time: 9ms
memory: 4648kb

input:

526583 1344 500217637

output:

108767800

result:

ok 1 number(s): "108767800"

Test #36:

score: 0
Accepted
time: 5ms
memory: 5140kb

input:

867054 769 93998191

output:

239123369

result:

ok 1 number(s): "239123369"

Extra Test:

score: 0
Extra Test Passed