赞
踩
当时想复杂了,一开始想选了一种情况之后后面的要变成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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。