2012-09-19 22:08:35Morris
[UVA] 10139 - Factovisors
Problem D: Factovisors
The factorial function, n! is defined thus for n a non-negative integer:0! = 1 n! = n * (n-1)! (n > 0)We say that a divides b if there exists an integer k such that
k*a = bThe input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31. For each input line, output a line stating whether or not m divides n!, in the format shown below.
Sample Input
6 9 6 27 20 10000 20 100000 1000 1009
Output for Sample Input
9 divides 6! 27 does not divide 6! 10000 divides 20! 100000 does not divide 20! 1009 does not divide 1000!
#include <stdio.h>
int p[5500], pt = 0;
void sieve() {
int i, j, m[50000] = {};
for(i = 2; i < 50000; i++)
if(m[i] == 0) {
p[pt++] = i;
for(j = i+i; j < 50000; j += i)
m[j] = 1;
}
}
int solve(int n, int m) {
int i;
for(i = 0; i < pt && p[i]*p[i] <= m; i++) {
if(m%p[i] == 0) {
int cnt = 0;
while(m%p[i] == 0)
cnt++, m /= p[i];
long long tmp = p[i], cnt2 = 0;
while(tmp <= n) {
cnt2 += n/tmp;
tmp *= p[i];
}
if(cnt2 < cnt) return 0;
}
}
if(m != 1) {
if(n < m) return 0;
}
return 1;
}
int main() {
sieve();
int n, m;
while(scanf("%d %d", &n, &m) == 2) {
if(solve(n, m))
printf("%d divides %d!\n", m, n);
else
printf("%d does not divide %d!\n", m, n);
}
return 0;
}