Maison > Article > développement back-end > Programme C++ pour compter le nombre de schémas de coloration qui satisfont à deux conditions
Supposons que nous ayons trois nombres N, M et K. Considérons qu’il y a N blocs disposés en rangée. Nous considérons les deux manières de coloration suivantes. Deux blocs sont colorés différemment si et seulement si les blocs sont colorés de couleurs différentes des deux manières suivantes : -
Pour chaque bloc, il est coloré en utilisant une des couleurs M (toutes les couleurs ne doivent pas être utilisées)
Il peut y avoir au plus K paires de blocs adjacents colorés de la même couleur
Si la réponse est trop grande, le résultat modulo 998244353 est renvoyé.
Donc si l'entrée est N = 3 ; M = 2 ; K = 1, la sortie sera 6 car nous pouvons colorier dans les différents formats suivants : 112, 121, 122, 211, 212 et 221.
Pour résoudre ce problème, nous suivrons les étapes suivantes :
maxm := 2^6 + 5 p := 998244353 Define two large arrays fac and inv or size maxm Define a function ppow(), this will take a, b, p, ans := 1 mod p a := a mod p while b is non-zero, do: if b is odd, then: ans := ans * a mod p a := a * a mod p b := b/2 return ans Define a function C(), this will take n, m, if m < 0 or m > n, then: return 0 return fac[n] * inv[m] mod p * inv[n - m] mod p From the main method, do the following fac[0] := 1 for initialize i := 1, when i < maxm, update (increase i by 1), do: fac[i] := fac[i - 1] * i mod p inv[maxm - 1] := ppow(fac[maxm - 1], p - 2, p) for initialize i := maxm - 2, when i >= 0, update (decrease i by 1), do: inv[i] := (i + 1) * inv[i + 1] mod p ans := 0 for initialize i := 0, when i <= k, update (increase i by 1), do: t := C(n - 1, i) tt := m * ppow(m - 1, n - i - 1, p) ans := (ans + t * tt mod p) mod p return ans
Voyons l'implémentation ci-dessous pour une meilleure compréhension −
#include <bits/stdc++.h> using namespace std; const long maxm = 2e6 + 5; const long p = 998244353; long fac[maxm], inv[maxm]; long ppow(long a, long b, long p){ long ans = 1 % p; a %= p; while (b){ if (b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans; } long C(long n, long m){ if (m < 0 || m > n) return 0; return fac[n] * inv[m] % p * inv[n - m] % p; } long solve(long n, long m, long k){ fac[0] = 1; for (long i = 1; i < maxm; i++) fac[i] = fac[i - 1] * i % p; inv[maxm - 1] = ppow(fac[maxm - 1], p - 2, p); for (long i = maxm - 2; i >= 0; i--) inv[i] = (i + 1) * inv[i + 1] % p; long ans = 0; for (long i = 0; i <= k; i++){ long t = C(n - 1, i); long tt = m * ppow(m - 1, n - i - 1, p) % p; ans = (ans + t * tt % p) % p; } return ans; } int main(){ int N = 3; int M = 2; int K = 1; cout << solve(N, M, K) << endl; }
3, 2, 1
6
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!