当前位置:   article > 正文

robocom选拔赛补题_robocom睿抗编程个人赛题目

robocom睿抗编程个人赛题目

猫猫取名

当时想复杂了,一开始想选了一种情况之后后面的要变成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)的累乘。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 10010, mod = 77797;
  5. ll name[N], a[15], vis[15];
  6. int main()
  7. {
  8. ios::sync_with_stdio(0);
  9. cin.tie(0);
  10. int n;
  11. cin >> n;
  12. for (int i = 1; i <= n; i++) cin >> name[i];
  13. sort(name + 1, name + n + 1);
  14. ll res = 1;
  15. for (int i = 1; i <= 10; i++){
  16. res = (res * 26) % mod;
  17. a[i] = (a[i - 1] + res) % mod;
  18. }
  19. res = 1;
  20. for (int i = 1; i <= 10; i++){
  21. res = res * 26;
  22. vis[i] = res;
  23. }
  24. ll ans = 1;
  25. ll k = 0;
  26. map<ll, ll> mp;
  27. for (int i = 1; i <= n; i++){
  28. int x = name[i];
  29. if (mp[x] > vis[x]){
  30. cout << "-1\n";
  31. return 0;
  32. }
  33. ans = (ans * ((a[x] - k) % mod)) % mod;
  34. k++;
  35. mp[x]++;
  36. }
  37. cout << ans << '\n';
  38. return 0;
  39. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/616981
推荐阅读
相关标签
  

闽ICP备14008679号