九度OJ 1104 整除问题
题目地址:http://ac.jobdu.com/problem.php?pid=1104
- 题目描述:
-
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
- 输入:
-
两个整数n(2<=n<=1000),a(2<=a<=1000)
- 输出:
-
一个整数.
- 样例输入:
-
6 10
- 样例输出:
-
1
#include <stdio.h> #include <string.h> #include <math.h> int IsPrime (int n){ if (n <= 1) return 0; int sq = (int)sqrt((double)n); while (sq >= 2){ if (n % sq == 0) break; --sq; } return (sq >= 2) ? 0 : 1; } void Initialize(int Prime[], int n, int * primeSize){ int index = 1; int num = 3; Prime[0] = 2; while (num < n){ if (IsPrime (num)){ Prime[index] = num; ++index; } num += 2; } *primeSize = index; } int main(void){ int n, a; int Prime[200]; int primeSize; int cnt1[200], cnt2[200]; int tmp; int i; Initialize(Prime, 1000, &primeSize); while (scanf ("%d%d", &n, &a) != EOF){ memset (cnt1, 0, sizeof(cnt1)); memset (cnt2, 0, sizeof(cnt2)); for (i=0; i<primeSize; ++i){ tmp = n; while (tmp){ cnt1[i] += tmp / Prime[i]; tmp /= Prime[i]; } } int ans = 10000000; for (i=0; i<primeSize; ++i){ while (a % Prime[i] == 0){ ++cnt2[i]; a /= Prime[i]; } if (cnt2[i] == 0) continue; if (cnt1[i] / cnt2[i] < ans) ans = cnt1[i] / cnt2[i]; } printf ("%d\n", ans); } return 0; }
参考资料:2013年王道论坛计算机考研机试指南