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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll v[1000100],prime[1000100],m;
void primes(ll n)
{
for(ll i=2; i<=n; i++)
{
if(v[i]==0)
{
v[i]=i;
prime[++m]=i;
}
for(ll j=1; j<=m; j++)
{
if(prime[j]>v[i]||prime[j]>n/i)
break;
v[i*prime[j]]=prime[j];
}
}
}
ll solve(ll a,ll b)
{
ll maxx=1;
for(ll i=1; i<=m&&prime[i]*prime[i]<=b; i++)
{
if(b%prime[i]==0)
{
ll x=prime[i],t=1;
while(b%prime[i]==0)
{
b/=prime[i];
if(t>0)
t--;
else
{
x+=prime[i];
ll q=x;
while(q%prime[i]==0)
q/=prime[i],t++;
t--;
}
}
maxx=max(x,maxx);
}
}
if(b>1)
maxx=max(maxx,b);
if(maxx<=a)
return 1;
else
return 0;
}
int main()
{
primes(1e6);
ll a,b;
while(scanf("%lld%lld",&a,&b)!=EOF)
{
if(b==0)
{
printf("%lld does not divide %lld!\n",b,a);
continue;
}
if(a==0)
{
if(solve(1,b))
printf("%lld divides %lld!\n",b,a);
else
printf("%lld does not divide %lld!\n",b,a);
continue;
}
if(solve(a,b))
printf("%lld divides %lld!\n",b,a);
else
printf("%lld does not divide %lld!\n",b,a);
}
}