比赛 20241129 评测结果 AAAAAAAAAA
题目名称 平方 最终得分 100
用户昵称 darkMoon 运行时间 0.965 s
代码语言 C++ 内存使用 27.51 MiB
提交时间 2024-11-29 09:12:56
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. auto IN = freopen("pingfang.in", "r", stdin);
  5. auto OUT = freopen("pingfang.out", "w", stdout);
  6. auto mread = [](){int x;scanf("%lld", &x);return x;};
  7. const int N = 1e5 + 5, M = 1e6 + 5, MOD = 1e9 + 7;
  8. int n = mread(), a[N], ans = 1;
  9. vector<int> v[M];
  10. int ksm(int x, int k){
  11. int ans = 1, now = x;
  12. while(k){
  13. if(k & 1){
  14. ans = ans * now % MOD;
  15. }
  16. now = now * now % MOD;
  17. k >>= 1;
  18. }
  19. return ans;
  20. }
  21. signed main(){
  22. for(int i = 1; i <= n; i ++){
  23. cin >> a[i];
  24. for(int j = 2; j * j <= a[i]; j ++){
  25. if(a[i] % j == 0){
  26. int tmp = 0;
  27. while(a[i] % j == 0){
  28. tmp ++;
  29. a[i] /= j;
  30. }
  31. if(tmp & 1){
  32. v[j].push_back(i);
  33. }
  34. }
  35. }
  36. if(a[i] > 1){
  37. v[a[i]].push_back(i);
  38. }
  39. }
  40. deque<int> d1, d2;
  41. for(int i = 2; i < M; i ++){
  42. d1.clear();
  43. d2.clear();
  44. for(int j = 0; j < v[i].size(); j ++){
  45. if(j == 0 && v[i][j] > 1){
  46. d1.push_back(v[i][j] - 1);
  47. d2.push_back(v[i][j] - 1);
  48. }
  49. if(j > 0 && v[i][j - 1] != v[i][j] - 1){
  50. d1.push_back(v[i][j] - 1);
  51. d2.push_back(v[i][j] - 1);
  52. }
  53. if(j == v[i].size() - 1 && v[i][j] < n){
  54. d1.push_back(v[i][j]);
  55. d2.push_back(v[i][j]);
  56. }
  57. if(j < v[i].size() - 1 && v[i][j + 1] != v[i][j] + 1){
  58. d1.push_back(v[i][j]);
  59. d2.push_back(v[i][j]);
  60. }
  61. }
  62. if(d1.size() == 0){
  63. continue;
  64. }
  65. int ans1 = 0, ans2 = 0;
  66. assert(d1.back() < n);
  67.  
  68. ans2 ++;
  69. if(d2[0] == 1){
  70. d2.pop_front();
  71. }
  72. else{
  73. d2.push_front(1);
  74. }
  75.  
  76. d1.push_back(n);
  77. d2.push_back(n);
  78. while(d1.size()){
  79. if(d1.front() == n){
  80. d1.pop_front();
  81. }
  82. else{
  83. int tmp = d1.front();
  84. d1.pop_front();
  85. ans1 += d1.front() - tmp;
  86. d1.pop_front();
  87. }
  88. }
  89. while(d2.size()){
  90. if(d2.front() == n){
  91. d2.pop_front();
  92. }
  93. else{
  94. int tmp = d2.front();
  95. d2.pop_front();
  96. ans2 += d2.front() - tmp;
  97. d2.pop_front();
  98. }
  99. }
  100. (ans *= ksm(i, min(ans1, ans2))) %= MOD;
  101. }
  102. printf("%lld", ans);
  103. return 0;
  104. }