比赛 |
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;
}