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

求mk整除n!,求k的最大值。

现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢?

考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5;1~10中有10/4个数是4的倍数,所以c += 2,其中有10/8 = 1个数是8的倍数,所以c += 1;

这样10!中就能分解出8个2

对于每个素数p,求出ci / ki的最小值就是答案。

 1 #include <cstdio>

 2 #include <cmath>

 3 #include <cstring>

 4 #include <vector>

 5 using namespace std;

 6 

 7 const int INF = 1000000000;

 8 const int maxn = 5000;

 9 bool vis[maxn + 10];

10 int prime[700], pcnt = 0;

11 

12 void Init()

13 {

14     int m = sqrt(maxn + 0.5);

15     for(int i = 2; i <= m; i++) if(!vis[i])

16         for(int j = i*i; j<= maxn; j += i) vis[j] = true;

17     for(int i = 2; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;

18 }

19 

20 vector<int> p, e, a;

21 

22 int main()

23 {

24     Init();

25     //printf("%d\n", pcnt);

26     int T;

27     scanf("%d", &T);

28     for(int kase = 1; kase <= T; kase++)

29     {

30         p.clear(); e.clear(); a.clear();

31         int m, n;

32         scanf("%d%d", &m, &n);

33         for(int i = 0; i < pcnt && m > 1; i++)

34         {

35             if(m % prime[i] == 0)

36             {

37                 int c = 0;

38                 while(m % prime[i] == 0)

39                 {

40                     m /= prime[i];

41                     c++;

42                 }

43                 e.push_back(c);

44                 p.push_back(prime[i]);

45             }

46         }

47 

48         int ans = INF;

49         for(int i = 0; i < p.size(); i++)

50         {

51             int c = 0, base = p[i];

52             while(n >= base)

53             {

54                 c += n / base;

55                 base *= p[i];

56             }

57             ans = min(ans, c / e[i]);

58         }

59         printf("Case %d:\n", kase);

60         if(ans) printf("%d\n", ans);

61         else puts("Impossible to divide");

62     }

63 

64     return 0;

65 }
代码君

 

你可能感兴趣的:(time)