[求条] 马蜂良好,有注释.自认为是对的
查看原帖
[求条] 马蜂良好,有注释.自认为是对的
766675
da_ke楼主2024/3/23 20:39
#include <bits/stdc++.h>

using namespace std;

const int N=10024;
const int MM=30034;

int n,m1,m2;
int ps=0;
int s[N],prime[MM];
map<int,int> f1,f2;
bitset<MM> vis;

int main(){
    cin>>n>>m1>>m2;
    for(int i=1;i<=n;++i)
        cin>>s[i];
    
    // Step 1 : 埃筛
    for(int i=2;i*i<=MM;++i)
        if(!vis[i])
            for(int j=i*i;j<=MM;j+=i)
                vis[j]=1;
    for(int i=2;i<=MM;++i)
        if(!vis[i])
            prime[++ps]=i;

    // Step 2 : 分解质因数m1^(m2)
    for(int i=1;i<=ps&&prime[i]*prime[i]<=m1;++i)
        while(m1%prime[i]==0)
            f1[prime[i]]+=m2,m1/=prime[i];
    if(m1!=1)
        f1[m1]+=m2;

    // Step 3 : 枚举Si
    int ans=1<<30;
    for(int i=1;i<=n;++i){
        bool ok=1;
        int tans=0;

        // Step 4 : 分解Si
        for(int i=1;i<=ps&&prime[i]*prime[i]<=s[i];++i)
            while(s[i]%prime[i]==0)
                f2[prime[i]]++,s[i]/=prime[i];
        if(s[i]!=1)
            f2[s[i]]++;

        // Step 5 : 处理指数
        for(int j=1;j<=ps;++j)
        {
            int o1=f1[prime[i]];
            int o2=f2[prime[i]];
            if(o1!=0&&o2==0)
                ok=0;
            if(o1&&o2!=0)
            {
                if(o1%o2==0)
                    tans=max(tans,o1/o2);
                else 
                    tans=max(tans,o1/o2+1);
            }
        }
        if(ok)
            ans=min(ans,tans);
    }
    cout<<((ans==1<<30)?-1:ans);
}

样例过不了qwq

2024/3/23 20:39
加载中...