Cod sursa(job #3328642)

Utilizator mateilupuMatei Lupu mateilupu Data 9 decembrie 2025 15:39:11
Problema Sandokan Scor 0
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <fstream>

using namespace std;

int f[30], fact[251];

int r(int a, int b) {
	int x = 1;
	while(b > 0) {
		if(b % 2 == 1) {
			b--;
			x = (x * a) % 9901;
		}
		else {
			b /= 2;
			a = (a * a) % 9901;
		}
	}
	return x;
}

int a(int n, int k) {
	return (fact[n] * r(fact[n - k], 9899)) % 9901;
}

int main()
{
	ifstream cin ("cod2.in");
	ofstream cout ("cod2.out");
	int n, i, m, k = 0, p = 0, sol = 0;
	string s;
	cin >> n >> s;
	m = s.size();
	for(i = 0; i < m; i++) {
		f[s[i] - 'a']++;
		if(f[s[i] - 'a'] == 1)
			k++;
		else if(f[s[i] - 'a'] == 2)
			p++;
	}
	fact[0] = 1;
	for(i = 1; i <= k; i++) {
		fact[i] = (fact[i - 1] * i) % 9901;
	}
	if(k - 1 >= n - 2) {
        sol = (n * (n - 1) / 2 * p) % 9901;
        sol = (sol * a(k - 1, n - 2)) % 9901;
	}
	if(k >= n)
        sol = (sol + a(k, n)) % 9901;
	cout << sol;
    return 0;
}