UVA 10780 - Again Prime? No Time
题意:求m^k能被n!整除,求最大的k
ps:这题最开始一头雾水……知道是质因数分解,但不造怎么弄,看了下大牛的代码和解释 -->大牛代码
看了后,感觉还行
我们首先将m质因数分解,得到它的质因数以及指数个数:m1^p1,m2^p2,m3^p3
我们再求n中m1,m2,m3的质因数的个数,假如分别得到为q1,q2,q3个
那么我们最后比较的时候则比较 min(q1/p1,q2/p2,q3/p3) 即可得到最大的k值
ps:p,q在代码里,重复利用了 废话(~ε(#~)☆╰╮(~▽~///)
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 5 using namespace std; 6 7 int t,counts;//计数器 8 int m,n; 9 10 void datecal(); 11 int factorn(int ,int); 12 13 void datecal() 14 { 15 int i=2; 16 int ans=0x3f3f3f3f; 17 18 while(m!=1) 19 { 20 int p=0; 21 while(m%i==0) 22 { 23 m/=i; 24 p++; 25 } 26 27 if(p!=0) 28 { 29 ans=min(ans,factorn(n,i)/p); 30 } 31 i++; 32 } 33 printf("Case %d:\n",counts++); 34 if(ans!=0) 35 printf("%d\n",ans); 36 else printf("Impossible to divide\n"); 37 38 } 39 40 int factorn(int n,int i)//得到n中质因数i的个数 41 { 42 int q=0; 43 while(n!=0) 44 { 45 q+=n/i; 46 n/=i; 47 } 48 return q; 49 } 50 51 52 int main() 53 { 54 scanf("%d",&t); 55 counts=1; 56 while(t--) 57 { 58 scanf("%d%d",&m,&n); 59 datecal(); 60 } 61 return 0; 62 }