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