A. Barriles de cerveza Número de combinaciones
Dirección de competencia:
https://www.jisuanke.com/contest/7321?view=challenges
Tema:
Déle cuatro números A, B, K, C y descubra cuántas veces aparece C entre los dígitos K compuestos de A y B.
Ideas basicas:
Creemos que si A y B son iguales e iguales a C, entonces la respuesta obvia es K, si A, B y C no son iguales, entonces la respuesta es obviamente 0, solo necesitamos considerar cuando uno de A y B es igual a C, suponiendo que A = C Entonces, en este momento, sabemos que el número de programas con 1 A en K es C (K, 1), y el programa con 2 A es C (K, 2), entonces el número total de A en el programa con i A Es decir, i * C (K, i), entonces la respuesta es C (K, 1) * 1 + C (K, 2) * 2 + C (K, 3) * 3 +… + C (K, K) * K .
Presta atención a la plantilla para el número de combinaciones y toma el módulo. Recuerda primero + MOD luego% MOD
#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f
const int maxn = 1010;
int fact[maxn];
inline int extgcd(int a,int b,int &x,int &y) {
int d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1;
y = 0;
}
return d;
}
inline int mod_inverse(int a,int m){
int x,y;
extgcd(a,m,x,y);
return (m + x % m) % m;
}
inline int mod_fact(int n,int p,int &e) {
e = 0;
if (n == 0) return 1;
int res = mod_fact(n / p, p, e);
e += n / p;
if (n / p % 2 != 0) return res * (p - fact[n % p] % p);
return res * fact[n % p] % p;
}
inline int mod_comb(int n,int k,int p) {
if (n < 0 || k < 0 || n < k) return 0;
int e1, e2, e3;
int a1 = mod_fact(n, p, e1), a2 = mod_fact(k, p, e2), a3 = mod_fact(n - k, p, e3);
if (e1 > e2 + e3) return 0;
return a1 * mod_inverse(a2 * a3 % p, p) % p;
}
int A,B,K,C;
const int mod = 1e9 + 7;
signed main() {
IO;
cin >> A >> B >> K >> C;
fact[0] = 0, fact[1] = 1;
for (int i = 2; i <= maxn; i++) fact[i] = fact[i - 1] * i % mod;
if (A != C && B != C) {
cout << 0 << endl;
} else {
if (A == B) cout << K << endl;
else {
int ans = 0;
for (int i = 1; i <= K; i++) {
ans = (ans + i * mod_comb(K, i, mod) + mod) % mod;
}
cout << ans << endl;
}
}
return 0;
}