ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#147072 | #37. 染色 | mayaming | 25 | 7ms | 1312kb | C++11 | 1.7kb | 2022-03-12 20:02:30 | 2022-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'