C. Qualification Rounds
阿新 • • 發佈:2018-12-24
組合問題:問給三種顏色的島,同種顏色不能相連,且建成後同種顏色的島嶼之間最短距離不能小於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)