组合问题:问给三种颜色的岛,同种颜色不能相连,且建成后同种颜色的岛屿之间最短距离不能小于3?数据量在5000左右
由于每种颜色自己和自己不能相连,所以只能和外面颜色相连,只要保证每个岛不会同时和两个颜色一样的岛屿相连就可以了,所以可以转化成每两种颜色的岛屿相连的方案数,然后再乘起来就行了。
每两种颜色的岛屿相连的方案数用组合数就能求出来:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def cal(x, n):
ans = 1
sum1 = x
while n > 0:
if n&1:
ans = (ans * sum1)%MON
n >>= 1
sum1 = (sum1 * sum1)%MON
MON = 998244353
N = 5000+20
def pecal():
fact[0] = 1
rfact[0] = 1
for i in range(1,N):
fact[i] = (fact[i-1]*i)%MON
rfact[i] = pow(fact[i], MON-2, MON)
return None
def cal(a, i):
return (((fact[a] * rfact[a-i]) % MON) *rfact[i]) % MON
def solve(x, y):
ans = 0
k = min(x, y)
for i in range(k+1):
ans += (cal(x, i) * cal(y, i) % MON) * fact[i] % MON
return ans
a,b,c = map(int, input().split(' '))
fact = [0]*N
rfact = [0]*N
pecal()
ans = (solve(a, b) * solve(a, c) % MON)* solve(b, c) % MON
print(ans)
还有更加简洁的写法如下:
a, b, c = map(int, input().split())
M = 998244353
def calc(a, b) :
if a > b:
a, b = b, a
ans = 0
t = 1
for i in range(a + 1):
ans = (ans + t) % M
t = t * (a - i) * (b - i) * pow(i + 1, M - 2, M) % M
return ans
ans = calc(a, b) * calc(b, c) * calc(a, c) % M
print(ans)