1. 程式人生 > >UVa 10780 Again Prime? No Time.(因子分解)

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

題目傳送門

題意:輸入包含多組資料,輸入的m,n。n!%m^k==0,求最大的這個k。

題解:對n,m進行因子分解,記錄每個質因子出現的次數,m的所有質因子出現的次數中的最小次數就是答案。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
typedef long long ll;
const int mod=1e9+7;
const int maxn=3e5+7;
int find1(int n,int i)//ans記錄n!中i因子出現的次數
{
    int ans=0,m;
    for(int j=2;j<=n;j++)
    {
        m=j;
       while(m%i==0)
       {
           m=m/i;
           ans++;
       }
    }
    return ans;
}
int main()
{
    int t,m,n,num;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>m>>n;
        int j=2,cnt=0,ans=999999999;
        while(m>1)
        {
            cnt=0;
            while(m%j==0)//cnt記錄m中j因子出現的次數
            {
                m=m/j;
                cnt++;
            }
            if(cnt>0)
            {
                num=find1(n,j)/cnt;//n!中次數除以m中的次數
                ans=min(ans,num);
            }
            j++;
        }
        cout<<"Case "<<i<<":"<<endl;
        if(ans>0)
            cout<<ans<<endl;
        else
            cout<<"Impossible to divide"<<endl;
    }
    return 0;
}