题解 | #整除问题#

整除问题

http://www.nowcoder.com/practice/8e29045de1c84d349b43fdb123ab586a

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
const int MAXN=1001;
int main()
{
    int n,a,k,i,t,j,mk,f;
    //cout<<6*5*4*3*2<<endl;
    map<int,int> s1,s2;
    bool isprime[MAXN];
    vector<int> prime;
    for(i=0;i<MAXN;i++)
        isprime[i]=true;
    isprime[0]=isprime[1]=false;
    for(i=2;i<MAXN;i++)
    {
        if(!isprime[i])
            continue;
        prime.push_back(i);
        for(j=i*i;j<MAXN;j=j+i)
            isprime[j]=false;
    }
    while(cin>>n>>a)
    {
        s1.clear();
        s2.clear();
        t=a;
        for(i=0;prime[i]<=a;)
        {
            if(t%prime[i]==0)
            {
                t=t/prime[i];
                if(s1.find(prime[i])!=s1.end())
                    s1[prime[i]]++;
                else
                    s1[prime[i]]=1;
                if(t==1)
                    break;
            }
            else
                i++;
        }
        for(k=2;k<=n;k++)
        {
            t=k;
            for(i=0;prime[i]<=k;)
            {
                if(t%prime[i]==0)
                {
                    t=t/prime[i];
                    if(s2.find(prime[i])!=s2.end())
                        s2[prime[i]]++;
                    else
                        s2[prime[i]]=1;
                    if(t==1)
                        break;
                }
                else
                    i++;
            }
        }/*
        for(map<int,int>::iterator it=s2.begin();it!=s2.end();it++)
            cout<<it->first<<":"<<it->second<<' ';
        cout<<endl;
        for(map<int,int>::iterator it=s1.begin();it!=s1.end();it++)
            cout<<it->first<<":"<<it->second<<' ';
        cout<<endl;*/
        mk=0;
        f=1;
        i=1;
        while(f)
        {
            for(map<int,int>::iterator it=s1.begin();it!=s1.end();it++)
            {
                if(s2.find(it->first)!=s2.end()&&s2[it->first]>=it->second*i)
                {
                    continue;
                }
                else
                {
                    f=0;
                    break;
                }
            }
            if(f==1)
            {
                mk=i;
                i++;
            }
            else
            {
                break;
            }
        }
        cout<<mk<<endl;

    }
    return 0;
}


全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务