比赛 |
20241129 |
评测结果 |
AAAAAAAAAA |
题目名称 |
平方 |
最终得分 |
100 |
用户昵称 |
darkMoon |
运行时间 |
0.965 s |
代码语言 |
C++ |
内存使用 |
27.51 MiB |
提交时间 |
2024-11-29 09:12:56 |
显示代码纯文本
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- auto IN = freopen("pingfang.in", "r", stdin);
- auto OUT = freopen("pingfang.out", "w", stdout);
- auto mread = [](){int x;scanf("%lld", &x);return x;};
- const int N = 1e5 + 5, M = 1e6 + 5, MOD = 1e9 + 7;
- int n = mread(), a[N], ans = 1;
- vector<int> v[M];
- int ksm(int x, int k){
- int ans = 1, now = x;
- while(k){
- if(k & 1){
- ans = ans * now % MOD;
- }
- now = now * now % MOD;
- k >>= 1;
- }
- return ans;
- }
- signed main(){
- for(int i = 1; i <= n; i ++){
- cin >> a[i];
- for(int j = 2; j * j <= a[i]; j ++){
- if(a[i] % j == 0){
- int tmp = 0;
- while(a[i] % j == 0){
- tmp ++;
- a[i] /= j;
- }
- if(tmp & 1){
- v[j].push_back(i);
- }
- }
- }
- if(a[i] > 1){
- v[a[i]].push_back(i);
- }
- }
- deque<int> d1, d2;
- for(int i = 2; i < M; i ++){
- d1.clear();
- d2.clear();
- for(int j = 0; j < v[i].size(); j ++){
- if(j == 0 && v[i][j] > 1){
- d1.push_back(v[i][j] - 1);
- d2.push_back(v[i][j] - 1);
- }
- if(j > 0 && v[i][j - 1] != v[i][j] - 1){
- d1.push_back(v[i][j] - 1);
- d2.push_back(v[i][j] - 1);
- }
- if(j == v[i].size() - 1 && v[i][j] < n){
- d1.push_back(v[i][j]);
- d2.push_back(v[i][j]);
- }
- if(j < v[i].size() - 1 && v[i][j + 1] != v[i][j] + 1){
- d1.push_back(v[i][j]);
- d2.push_back(v[i][j]);
- }
- }
- if(d1.size() == 0){
- continue;
- }
- int ans1 = 0, ans2 = 0;
- assert(d1.back() < n);
-
- ans2 ++;
- if(d2[0] == 1){
- d2.pop_front();
- }
- else{
- d2.push_front(1);
- }
-
- d1.push_back(n);
- d2.push_back(n);
- while(d1.size()){
- if(d1.front() == n){
- d1.pop_front();
- }
- else{
- int tmp = d1.front();
- d1.pop_front();
- ans1 += d1.front() - tmp;
- d1.pop_front();
- }
- }
- while(d2.size()){
- if(d2.front() == n){
- d2.pop_front();
- }
- else{
- int tmp = d2.front();
- d2.pop_front();
- ans2 += d2.front() - tmp;
- d2.pop_front();
- }
- }
- (ans *= ksm(i, min(ans1, ans2))) %= MOD;
- }
- printf("%lld", ans);
- return 0;
- }