#include <iostream>
using namespace std;
const int N=1001;
const int INF=0x7fffffff;
int primesize=0;
int prime[N];
int nsum[N];
int asum[N];
void getprime(int n)
{
int count=0;
prime[count++]=2;
for(int i=3;i<=n;i++)
{
bool flag=true;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
flag=false;
break;
}
}
if(flag)
prime[count++]=i;
}
primesize=count;
}
void func()
{
getprime(N);// 计算N之前的PRIME并保存到数组中
int n,a;
while(cin>>n>>a)
{
for(int i=0;i<primesize;i++)
{
int sum=0;
int t=prime[i];
int tmp=n;
while(tmp)
{
sum+=tmp/t;
tmp/=t;
}
nsum[i]=sum;// N!中每个素数因数的个数
// 求N!对T的个数算法是Z=N/T+N/(T^2)+N/(T^3)……
}
int k=INF;
for(int i=0;i<primesize;i++)
{
int t=prime[i];
int tmp=a;
int sum=0;
while(tmp%t==0)
{
tmp/=t;
sum++;
}
if(sum==0)continue;// 计算A对每个素因数的个数,如果为0略过这个素数
if(nsum[i]/sum<k)// 如果有这个素数,循环求出最小的K,其中K是N!中素因数个数与A的商,因为有K个A
k=nsum[i]/sum;
}
cout<<k<<endl;
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
大数判断整除问题
其中用到的理论有:
1.任何数都可以分解为质因数的积;
2.求N!中含有T的质因数个数,算法是Z=N/T+N/(T^2)+N/(T^3)…… ;思路是
每个T的倍数中有一个T,小于等于N的数中有N/T个倍数,所以先加上N/T;
每个T^2的倍数中至少有两个T,但第一遍T的倍数也包括T^2的倍数,已经计算过一次,所以只用再加上N/T^2;
依次…………
直到N/T^X得到0为止,后面的都肯定为0,计算终结
3.若a能够整除b,则a的素因数,b都有,且相同素因数中b的素因数的幂大于等于a的素因数的幂。
-
题目描述:
-
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
-
输入:
-
两个整数n(2<=n<=1000),a(2<=a<=1000)
-
输出:
-
一个整数.
-
样例输入:
-
6 10
-
样例输出:
-
1