UVA 10780

题意:求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:
",counts++);
34     if(ans!=0)
35         printf("%d
",ans);
36     else printf("Impossible to divide
");
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 }
原文地址:https://www.cnblogs.com/byzsxloli/p/5489249.html