平方

平方

题意

给定 \(n\) 个数,然后让你拟定一个长度为 \(n\) 的数组 \(t\),使得 \(t_i>1\),且满足对于任意的 \(a_i\times a_{i+1}\times t_i\times t_{i+1}\) 为完全平方数,求 \(\min\prod t_i\)

\(1\le n\le 10^5,1\le a_i\le 10^6\)

考虑质因数之间是独立的关系,我们按照每种质因数在每个数中的奇偶性考虑。

性质:对于一个完全平方数,它的任意一个质因子都是偶数次幂。

我们考虑到对于某个质因子,每个数可能是偶数次幂,也可能是奇数次幂。

发现要么将所有偶数次幂的数变为奇数次幂,要么反过来。

每次修改必然只乘一个质因子,那么答案就乘 \(p^{\min}\),奇数次幂/偶数次中较少者为 \(\min\)

#include<cstdio>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
namespace fstIO{
    const char _fg='\n';
    int _len=0;
    char ibuf[(1<<20)+1],*iS,*iT,_out[(1<<25)+1],_ar[50];
    #define _gh()\
    (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),\
    (iS==iT?EOF:*iS++):*iS++)
    #define putc(ch) _out[_len++]=ch
    void read(){}
    template<typename Type,typename...Types>
    void read(Type&x,Types&...xs){
        x=0;
        char ch=_gh();
        char t=0;
        while(ch<'0'||ch>'9')t|=ch=='-',ch=_gh();
        while(ch>='0'&&ch<='9')x=x*10+(ch^48),ch=_gh();
        x=t?-x:x;
        read(xs...);
    }
    template<typename Type>
    void write(Type x){
        int tot=0;
        if(!x)putc('0');
        if(x<0)putc('-'),x=-x;
        while(x)_ar[++tot]=x%10+'0',x/=10;
        for(int i=tot;i;--i)putc(_ar[i]);
        putc(_fg);
    }
    void flush(){
        fwrite(_out,1,_len,stdout);
        _len=0;
    }
}
using namespace fstIO;
const int N=100010,M=10*N,mod=1000000007;
int n,p[N],tot,maxn,st[M],c[N];
typedef long long ll;
int min(int a,int b){
    return a<b?a:b;
}
int qpow(ll a,int b){
    ll res=1;
    Wh(b){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main(){
    freopen("square.in","r",stdin);
    freopen("square.out","w",stdout);
    read(n);
    Ls(i, 2, M){
        if(!st[i])p[++tot]=i,st[i]=tot;
        for(int j=1;j<=tot&&p[j]*i<M;++j){
            st[p[j]*i]=j;
            if(i%p[j]==0)break;
        }
    }
    E(i, n){
        int x,lst=0,cnt=0;
        read(x);
        for(;x>1;x/=p[st[x]]){
            if(st[x]!=lst){
                c[lst]+=cnt&1;
                cnt=1;
                lst=st[x];
            }
            else++cnt;
        }
        c[lst]+=cnt&1;
    }
    int ans=1;
    E(i, tot)
        ans=1ll*ans*qpow(p[i],min(c[i],n-c[i]))%mod;
    printf("%d",ans);
    return 0;
}
posted @ 2023-11-17 12:59  wscqwq  阅读(5)  评论(0编辑  收藏  举报