UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#147072#37. 染色mayaming257ms1312kbC++111.7kb2022-03-12 20:02:302022-03-12 20:02:31

answer

// http://noi.ac/problem/37

#include <iostream>

using namespace std;

typedef unsigned long long ull;
const int MAX_N = 5001;

ull mod[MAX_N];  // n! % p的结果
// 如果m > n,就是m的n次方模p的结果
ull f[MAX_N];  // n个元素的解法个数 f(n) = (f(n-1) - g(n-1)) * m + g(n-1) * (m-1)
ull g[MAX_N];  // n个元素,且最后m-1个元素各不相同的解法个数 g(n) = f(n-m+1) * C(m-2, m-1) * P(m-1)

// a的b次方模p
// 假设b = 11,即1011,那么pow(a, b) = pow(a, 8) * pow(a, 2) * pow(a, 1)
ull fast_pow_mod(ull a, ull b, ull p) {
    ull res = 1;
    ull cur = a % p;
    while (b > 0) {
        if (b & 1) {
            res = res * cur % p;
        }
        cur = cur * cur % p;
        b >>= 1;
    }
    return res;
}

int main() {
    int n, m, p;

    while (cin >>n >>m >>p) {
        if (m == 1) {
            cout <<1 <<endl;
        }
        else if (m > n) {
            cout <<fast_pow_mod(m, n, p) <<endl;
        }
        else {
            for (int i = 0; i <= n; ++i) {
                mod[i] = (i == 0) ? 1 : ((mod[i-1] * i) % p);
            }

            for (int i = 1; i <= n; ++i) {
                if (i < m) {
                    f[i] = fast_pow_mod(m, i, p);
                }
                else if (i == m) {
                    f[i] = (p + fast_pow_mod(m, i, p) - mod[m]) % p;
                    g[i] = (m * (m-1) % p) * mod[m-1] % p; 
                }
                else {
                    f[i] = ((p + f[i-1] - g[i-1]) % p * m % p + g[i-1] * (m-1) % p) % p;
                    g[i] = (f[i-m+1] * (m-1) % p) * mod[m-1] % p;
                }
            }
        }

        cout <<f[n] <<endl;
    }
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 5
Accepted
time: 1ms
memory: 1200kb

input:

5 2 6

output:

2

result:

ok 1 number(s): "2"

Test #2:

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

input:

8 8 562455908

output:

16736896

result:

ok 1 number(s): "16736896"

Test #3:

score: 0
Wrong Answer
time: 0ms
memory: 1244kb

input:

1942 7 873185963

output:

547681916

result:

wrong answer 1st numbers differ - expected: '41441893', found: '547681916'

Test #4:

score: 0
Wrong Answer
time: 0ms
memory: 1248kb

input:

2030 10 187301366

output:

92217946

result:

wrong answer 1st numbers differ - expected: '171496026', found: '92217946'

Test #5:

score: 0
Wrong Answer
time: 0ms
memory: 1304kb

input:

4643 9 998244353

output:

341166281

result:

wrong answer 1st numbers differ - expected: '583546139', found: '341166281'

Test #6:

score: 0
Wrong Answer
time: 1ms
memory: 1192kb

input:

1447 3969 998244353

output:

669602806
0

result:

wrong answer Output contains longer sequence [length = 2], but answer contains 1 elements

Test #7:

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

input:

226 212 998244352

output:

503316480

result:

ok 1 number(s): "503316480"

Test #8:

score: 0
Wrong Answer
time: 0ms
memory: 1208kb

input:

300 292 779230672

output:

314361840

result:

wrong answer 1st numbers differ - expected: '95153840', found: '314361840'

Test #9:

score: 0
Wrong Answer
time: 0ms
memory: 1212kb

input:

269 228 479932618

output:

353272520

result:

wrong answer 1st numbers differ - expected: '244481530', found: '353272520'

Test #10:

score: 0
Wrong Answer
time: 0ms
memory: 1212kb

input:

216 112 207794912

output:

91893920

result:

wrong answer 1st numbers differ - expected: '145540448', found: '91893920'

Test #11:

score: 0
Wrong Answer
time: 0ms
memory: 1208kb

input:

291 261 37264436

output:

12738085

result:

wrong answer 1st numbers differ - expected: '28883269', found: '12738085'

Test #12:

score: 0
Wrong Answer
time: 0ms
memory: 1208kb

input:

273 218 960539553

output:

107014859

result:

wrong answer 1st numbers differ - expected: '718739009', found: '107014859'

Test #13:

score: 0
Wrong Answer
time: 0ms
memory: 1264kb

input:

2991 2318 704783019

output:

51260519

result:

wrong answer 1st numbers differ - expected: '517763339', found: '51260519'

Test #14:

score: 0
Wrong Answer
time: 0ms
memory: 1304kb

input:

4413 790 693631006

output:

444423254

result:

wrong answer 1st numbers differ - expected: '634441922', found: '444423254'

Test #15:

score: 5
Accepted
time: 2ms
memory: 1276kb

input:

4786 4581 2

output:

1

result:

ok 1 number(s): "1"

Test #16:

score: 0
Wrong Answer
time: 2ms
memory: 1280kb

input:

4953 4424 876277826

output:

44865276

result:

wrong answer 1st numbers differ - expected: '746769658', found: '44865276'

Test #17:

score: 0
Wrong Answer
time: 0ms
memory: 1312kb

input:

4921 37 699201223

output:

274223084

result:

wrong answer 1st numbers differ - expected: '206663263', found: '274223084'

Test #18:

score: 0
Wrong Answer
time: 1ms
memory: 1304kb

input:

4991 994 533908193

output:

123938696

result:

wrong answer 1st numbers differ - expected: '86765287', found: '123938696'

Test #19:

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

input:

5000 5000 640462742

output:

518214138

result:

ok 1 number(s): "518214138"

Test #20:

score: 0
Wrong Answer
time: 0ms
memory: 1304kb

input:

4935 1005 961254358

output:

615650147

result:

wrong answer 1st numbers differ - expected: '202283451', found: '615650147'