Pagini recente » Borderou de evaluare (job #3103037) | Borderou de evaluare (job #805135) | Cod sursa (job #3339435) | Cod sursa (job #1921973) | Cod sursa (job #3328642)
#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;
}