Uva 10780 Again Prime? No Time.(分解质因子)

题意:给你两个数m和n,问 n! 可以被 m^k 整除的k的最大值

思路:从这道我们可以想到n!末尾有多少个0的问题,让我们先想一下它的思想,我们找 n! 末尾有多少0,

        实际上我们是在找n!中5的个数,为什么找 5 的个数,是因为若末尾要有0,就必须要找有几个10的倍数,

        而10是由 2 5(ps:10=2*5)组成的,而2的数量足够多,所以我们只需要找5 的个数就行

        我们在来看看这道题,题目要求求出可以被 m^k 整除的k的最大值,我们就可以找n!中 m 的个数,

        根据正整数唯一分解定理,m 必然可以分成若干素数的乘积,假设 m=p1^k1*p2^k2;

        我们找出n!中p1分子的个数 num1,再找出n!中p2分子的个数 num2

        num2/k1 与 num2/k2  比较,哪个小,哪个就是 n!中 m 的个数,因为大的那个可以提供足够多的数量

代码:

#include <iostream>
#include <vector>
#include <cstring>
#include<fstream>
using namespace std;

int main()
{
    int t,m,n,tmp,c=1;
    int num[99999],many[99999];
    int ans;
    cin>>t;
    while(t--)
    {
        vector <int> p;
        memset(num,0,sizeof(num));
        memset(many,0,sizeof(many));
        cin>>m>>n;
        tmp=m;
        for(int i=2; i*i<=tmp; i++)
        {
            if(tmp%i==0)
            {
                p.push_back(i);
                while(tmp%i==0)
                {
                    tmp=tmp/i;
                    many[i]++;
                }
            }
        }
        if(tmp>1)
        {
            p.push_back(tmp);
            many[tmp]++;
        }
            for(int i=1; i<=n; i++)
            {
                for(int j=0; j<p.size(); j++)
                {
                    tmp=i;
                    while(tmp%p[j]==0)
                    {
                        num[p[j]]++;
                        tmp=tmp/p[j];
                    }
                }
            }
            ans=999999;
            for(int i=0; i<p.size(); i++)
            {
                int temp=num[p[i]]/many[p[i]];
                if(ans>temp)
                {
                    ans=temp;
                }
            }
            cout<<"Case "<<c++<<":"<<endl;
            if(ans)
            cout<<ans<<endl;
            else
             cout<<"Impossible to divide"<<endl;
        }
        return 0;
    }

 

          

posted @ 2016-12-04 20:57  邻家那小孩儿  阅读(443)  评论(0编辑  收藏  举报