卧薪尝胆,厚积薄发。
HAOI2007 反素数
Date: Wed Aug 01 15:15:50 CST 2018
In Category:
NoCategory
Description:
对于任何正整数
$x$
,其约数的个数记作
$g(x)$
。如果某个正整数
$x$
满足:
$g(x)>g(i) \text{ }0<i<x$
,则称
$x$
为反质数,求出不超过
$N$
的最大的反质数。
$1\le n \le 2\times 10^9$
Solution:
由唯一分解定理得
$x=\prod p_i^{q_i}$
,则对于一个反质数,一定有
$q_i>q_j(i<j)$
,因为由约数个数定理得
$\sigma_0(x)=\prod(q_i+1)$
,如果
$q_i<q_j(i<j)$
,则可以交换
$q_i$
和
$q_j$
,得到一个更小的约数个数相同的数,一定不合法,于是就可以搜索了。
由于前
$10$
个质数的积大于
$2\times10^9$
,于是只用这些质数搜即可。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll prime[13] = {0,2,3,5,7,11,13,17,19,23,29};
ll ans1 = 0,ans2;
void dfs(ll cur,ll pos,ll tot,ll power)
{
if(cur > n)return;
if(pos == 13)
{
if(tot > ans1 || (tot == ans1 && cur < ans2))
{
ans1 = tot;
ans2 = cur;
}
return;
}
for(ll i = 0;i <= power;++i)
{
dfs(cur,pos + 1,tot * (ll)(i + 1),i);
cur *= prime[pos];
if(cur > n)break;
}
return;
}
int main()
{
cin >> n;
dfs(1,1,1,31);
cout << ans2 << endl;
return 0;
}
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡