分解质因数
思路
若整数
a
a
a是整数
b
b
b的倍数,则
a
a
a的每个质因数的幂次一定要大于等于对应的
b
b
b的每个质因数的幂次。
对于本题,要求最小的整数n,使得n的阶乘是p的倍数,则可以先对n的阶乘分解质因数,判断是否n阶乘的质因数的幂次大于p的质因数的幂次。在1~p中二分n的值即可。
ll factory(ll n, ll s) { //n!对素数s的求解
ll sum = 0;
while (n) {
n /= s;
sum += n;
}
return sum; //返回幂
}
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e5+5;
ll t, p, prime[N], c[N], m;
void divide(ll n)//对n分解质因数
{
m = 0;
for(ll i = 2; i <= sqrt(n); i++)
{
if(n % i == 0)
{
prime[++m] = i;
c[m] = 0;
while(n % i == 0)
{
n /= i;
c[m]++;
}
}
}
if(n > 1)
{
prime[++m] = n;
c[m] = 1;
}
/*for(int i = 1; i <= m; i++)
cout << prime[i] << ' ' << c[i] << endl;*/
}
bool valid(ll x)
{
for(ll i = 1; i <= m; i++)
{
ll n = x, cnt = 0;
while(n)
{
cnt += n / prime[i];
n /= prime[i];
}
if(cnt < c[i])
return false;
}
return true;
}
int main()
{
cin >> t;
while (t--)
{
memset(prime, 0, sizeof(prime));
memset(c, 0, sizeof(c));
cin >> p;
divide(p);
ll l = 1, r = p;
while(l < r)
{
ll mid = (l + r) >> 1;
if(valid(mid))
r = mid;
else
l = mid + 1;
}
cout << r << endl;
}
return 0;
}