当时想复杂了,一开始想选了一种情况之后后面的要变成pow(26,x - 1) * 25(1 <= x <= ai - 1)的累乘。
实际上a为{7,10,5}时,先给10的猫猫取长度大于7的名字不会对其他两只猫猫产生影响,但是取1~5的长度的名字时会对另外两只猫猫都产生影响,6~7的长度时只对一只猫猫有影响。这样会很复杂,但是将a数组从小到大排序之后每只猫猫都会对后面的猫猫产生影响。后面的猫猫的取名总可能数(不考虑其他猫猫的影响)只需要减去在它前面的猫猫数量就是实际的总取名可能数。
ai的值很小,先前缀和处理出所有ai的情况,再累乘计算总数即可。不合理的情况为名字长度为ai的猫猫数量大于pow(26,x)(1 <= x <= ai)的累乘。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10010, mod = 77797;
ll name[N], a[15], vis[15];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> name[i];
sort(name + 1, name + n + 1);
ll res = 1;
for (int i = 1; i <= 10; i++){
res = (res * 26) % mod;
a[i] = (a[i - 1] + res) % mod;
}
res = 1;
for (int i = 1; i <= 10; i++){
res = res * 26;
vis[i] = res;
}
ll ans = 1;
ll k = 0;
map<ll, ll> mp;
for (int i = 1; i <= n; i++){
int x = name[i];
if (mp[x] > vis[x]){
cout << "-1\n";
return 0;
}
ans = (ans * ((a[x] - k) % mod)) % mod;
k++;
mp[x]++;
}
cout << ans << '\n';
return 0;
}