题意 :
给定n只小猫,第i只小猫允许自己的名字最多有ai 个小写字母,问给所有小猫取名的方案数,答案对7779777797取模。
数据范围:1 <= n <= 10^4 , 1≤ai≤10
思路 :
就是容斥原理吧 , 预先处理一到10的方案数目 , 然后对a[i]个数 - (i - 1) , 判断是否满足分配 ,只是比赛的时候想偏了 。 /(ㄒoㄒ)/~~
代码 :
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const ll maxn = 1e5 + 10 ;
const ll mod = 77797 ;
ll act[11] ;
ll a[maxn] ;
int main(){
ll n ;
cin >> n ;
act[0] = 1 ;
for(int i = 1 ; i <= 10 ; i++) act[i] = act[i-1] * 26 ;
act[0] = 0 ;
for(int i = 1 ; i <= 10 ; i++) act[i] = (act[i] + act[i-1]) % mod ;
//for(int i = 1 ; i <= 10 ; i++) cout << act[i] << endl ;
ll ans = 1 ;
for(ll i = 1 ; i <= n ; i++) cin >> a[i] ;
sort(a + 1 , a + 1 + n) ;
for(ll i = 1 ; i <= n ; i++){
if(act[a[i]] - (i - 1) < 0){ //不满足分配
cout << -1 << endl ;
return 0 ;
}
else{
ans = (ans * (act[a[i]] - (i - 1))) % mod ;
}
}
cout << ans % mod << endl ;
return 0 ;
}