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 = b
The 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;
}