Description
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
Input
The input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31.
Output
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
Sample Output
9 divides 6!
27 does not divide 6!
10000 divides 20!
100000 does not divide 20!
1009 does not divide 1000!
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 100000
int prime[N],vis[N],num;
void eular()
{
num = 0;
memset(vis, 1, sizeof(vis));
vis[0] = vis[1] = 0;
for (int i=2; i<N; i++)
{
if (vis[i])
{
prime[num++] = i;
}
for (int j=0; j<num && i*prime[j] < N; j++)
{
vis[i * prime[j]]= 0;
if (i%prime[j] == 0)
{
break;
}
}
}
}
int coun(int a,int b)
{
int y = 0;
while (a)
{
a /= b;
y += a;
}
return y;
}
int flag(int n,int m)
{
for (int i=0; i<num && prime[i]<=sqrt(m); i++)
{
if (m % prime[i] == 0)
{
int x = 0;
while (m % prime[i] == 0)
{
m = m/prime[i];
x++;
}
if (x > coun(n,prime[i]))
{
return 0;
}
}
}
if (m > 1 && n < m)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int n,m;
eular();
while (scanf ("%d%d",&n,&m) != EOF)
{
if (m==0)
{
printf ("%d does not divide %d!\n",m,n);
continue;
}
int mm =m,nn = n;
if (flag(n,m) == 0)
{
printf ("%d does not divide %d!\n",mm,nn);
}
else
{
printf ("%d divides %d!\n",mm,nn);
//continue;
}
}
return 0;
}