1. 程式人生 > >C. Qualification Rounds

C. Qualification Rounds

組合問題:問給三種顏色的島,同種顏色不能相連,且建成後同種顏色的島嶼之間最短距離不能小於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)