[NOIP 2009] 细胞分裂(选做)

思路

这题其实很容易想到质因子分解,但是我们只能分解m1^m2的质因子,不能把每个读入的s全部分解开。

对于s来说,只要它的质因子种类包括了所有的m1^m2的质因子种类,这个s就一定可以求出来一个时间,让他们的对应的指数相除取最大,因为初始的时候指数为0,所以用除法。

s只需要分解m1^m2的质因子就可以了,这样速度就上去了。

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn=3e5+10;
const int INF=0x3f3f3f3f;
unordered_map<ll,ll> a,b;

int main()
{
    ll n,m1,m2,t;
    scanf("%lld%lld%lld",&n,&m1,&m2);
    if (m1==1) {
        ll t;
        for (int i=0;i<n;i++) {
            scanf("%lld",&t);
        }
        printf("0\n");
        return 0;
    }
    ll i=2;
    while (m1!=1) {
        while (m1%i==0) {
            a[i]++;
            m1/=i;
        }
        if (a.find(i)!=a.end())
            a[i]*=m2;
        i++;
    }
    ll ans=INF;
    for (int i=0;i<n;i++) {
        scanf("%lld",&t);
        ll ps=-INF;
        bool flag=true;
        for (auto p:a) {
            if (t%p.first!=0) {
                flag=false;
                break;
            }
            ll cnt=0;
            while (t%p.first==0) {
                cnt++;
                t/=p.first;
            }
            if (p.second>=cnt) {
                ll div=p.second/cnt;
                if (cnt*div<p.second)
                    div++;
                ps=max(ps,div);
            }
            else {
                ps=max(ps,1LL);
            }
        }
        if (flag) {
            ans=min(ans,ps);
        }
    }
    if (ans==INF||ans==-INF) {
        printf("-1\n");
    }
    else {
        printf("%lld\n",ans);
    }
    return 0;
}
/*
100
12125 1
39703 1 5 53645 457192049 45953 15679 97 1 1 5 5581 324355 84685 41539 5 485 1 97 485 1 339035 97 25 79657 1 1 361519 97 1 1 1 1 97 270533 3780769 1 182795 1 5 16865 68539 3469 1 97 5 1 1 5 26729 97 1 1 247654289 5 1 1 1 97 485 1 97 1 97 1 1 25 36887 99277 5 1 138025 10859635 97 50423 5 18397 1 5 1 836819 84067 607219735 46337 1 97 97 71257 1 97 95803 1 21859 57895 1 1 1 1 25247 1
*/
posted @ 2020-03-03 20:41  xyee  阅读(225)  评论(0编辑  收藏  举报