九度OJ 1104:整除问题 (整除、因式分解)
- 题目描述:
-
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
- 输入:
-
两个整数n(2<=n<=1000),a(2<=a<=1000)
- 输出:
-
一个整数.
- 样例输入:
-
6 10
- 样例输出:
-
1
思路:
对a进行因式分解,记录素因子以及个数。计算n!过程中,累加记录的相关素因子个数,直到所有的素因子个数都超过a的素因子个数乘(k+1),这时的n减去1就是答案。
但该题如果给定输入数据不当,可能会存在bug,即对所有的k,都同时满足或同时不满足被a^k整除和被a^(k+1)整除。
代码:
#include <stdio.h> #include <math.h> #include <string.h> #define N 1000 int p[N+1], cp; typedef struct node { int num; int count; int acount; } PP; PP pa[N+1]; int cpa; int isprime(int x) { for (int i=2; i<=sqrt(x); i++) { if (x%i == 0) return 0; } return 1; } void getPrimes(int x) { int i = 1; cpa = 0; while (x != 1) { if (x % p[i] == 0) { cpa ++; pa[cpa].num = p[i]; pa[cpa].count = 0; while (x % p[i] == 0) { pa[cpa].count ++; x /= p[i]; } } i ++; } } int main(void) { int n, a, k, i, j, r; cp = 0; for (i=2; i<=N; i++) { if (isprime(i)) p[++cp] = i; } //for (i=1; i<=cp; i++) // printf("%d ", p[i]); //printf("\n"); while (scanf("%d%d", &n, &a) != EOF) { getPrimes(a); for (r=1; r<=cpa; r++) pa[r].acount = 0; for(i=2; i<=n; i++) { j = i; r = 1; while (j != 1) { if (r > cpa) break; while (j%(pa[r].num) == 0) { pa[r].acount ++; j /= (pa[r].num); } r ++; } } k = pa[1].acount/pa[1].count; for (r=2; r<=cpa; r++) { int kk = pa[r].acount/pa[r].count; if (kk < k) k = kk; } printf("%d\n", k); //for (r=1; r<=cpa; r++) // printf("%d %d %d\n", pa[r].num, pa[r].count, pa[r].acount); } return 0; } /************************************************************** Problem: 1104 User: liangrx06 Language: C Result: Accepted Time:10 ms Memory:944 kb ****************************************************************/
编程算法爱好者。