Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么
?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
题解:
我们要求范围内最小的因数最多的数
对于一个整数x,可以将它唯一分解为 x = p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p n a n x = p_1^{a_1}*p_2^{a_2}*...*p_n^{a_n} x=p1a1∗p2a2∗...∗pnan的形式,其中p为质数,那么它的因子个数为 ( a 1 + 1 ) ∗ ( a 2 + 1 ) ∗ . . . ∗ ( a n + 1 ) (a_1+1)*(a_2+1)*...*(a_n+1) (a1+1)∗(a2+1)∗...∗(an+1),要求质数最小,那么显然p从2开始,然后爆搜即可
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define int long long
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
const int MAXN = 1e5+10;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
int pri[15]={1,2,3,5,7,11,13,17,19,23,29,31};
int n,ans=1,num=1;
void dfs(int now,int val,int cnt,int last){
if(now==12){
if(val>ans&&cnt>num){ ans=val;num=cnt; }
if(val<=ans&&cnt>=num){ ans=val;num=cnt; }
return;
}
for(int i=0,t=1;i<=last;i++){
dfs(now+1,val*t,cnt*(i+1),i);
t*=pri[now];
if(val*t>n) break;
}
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGE
scanf("%lld",&n);
dfs(1,1,1,20);
printf("%lld",ans);
return 0;
}