警示后人
查看原帖
警示后人
766675
da_ke楼主2024/7/14 23:20

本人又来debug 这道题发现一个问题:、

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);++i)

using namespace std;
typedef long long ll;
typedef double db;

const int N=1e4+23;
const int M=3e4+23;

int n,m1,m2,s[N];
bool vis[M];
int cnt=0,prime[M],f1[M],f2[M];

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    cin>>n>>m1>>m2;
    rep(i,1,n) cin>>s[i];
    for(int i=2;i*i<=M;++i)
        if(!vis[i]) for(int j=i*i;j<=M;j+=i)
            vis[j]=1;
    for(int i=2;i<M;++i)
        if(!vis[i])
            prime[++cnt]=i;
    for(int i=1;i<=cnt&&prime[i]*prime[i]<=m1;++i)
        while(m1%prime[i]==0) f1[prime[i]]+=m2,m1/=prime[i];
    if(m1!=1) f1[m1]+=m2;
    int ans=1<<29;
    rep(k,1,n)
    {
        memset(f2,0,sizeof(f2));
        for(int i=1;i<=cnt&&prime[i]*prime[i]<=s[k];++i){
            while(s[k]%prime[i]==0) f2[prime[i]]++,s[k]/=prime[i];
        }
        if(s[k]!=1&&s[k]<=M) f2[s[k]]++; // 注意 RE
        bool flag=1;int tans=0;
        for(int i=1;i<=cnt;++i)
        {
            int u1=f1[prime[i]],u2=f2[prime[i]];
            if(u1&&!u2){flag=0;break;}
            else if(u1&&u2)
            {
                if(u2%u1==0) tans=max(tans,u1/u2);
                else tans=max(tans,u1/u2+1);
            }
        }
        if(flag) ans=min(ans,tans);
    }
    cout<<((ans==1<<29)?-1:ans);
}

中tans=max(tans,u1/u2+1);改为向上取整。

警示后人。

2024/7/14 23:20
加载中...