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; }
你若是天才,我便是疯子