[HAOI2007]反素数

[HAOI2007]反素数

题目描述

对于任何正整数x,其约数的个数记作$g\left ( x \right )$。例如$g\left ( 1 \right )=1,g\left ( 6 \right )=4$。

如果某个正整数x满足:$0 \lt i \lt x$,都有$g\left ( x \right )>g\left ( i \right )$,则称为反质数。例如,整数$1,2,3,4$等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?

输入格式

一个数N

输出格式

不超过N的最大的反质数。

输入输出样例

输入 
1000
输出
840

说明/提示

$1\leq N\leq 2\times 10^{9}$


 

sol:

这题需要知道几个性质。

$1.$ 我们要找的答案就是$[1,N]$里面约数个数最多同时尽可能小的数

$2.$
$[1,N]$中任何的不同质因子都不会超过$10$个,且所有质因子的指数总和不超过$30$。

证明:
最小的 $ 11 $个质数的积

$2 \times 3 \times 5 \times 7 \times 11 \times 13 \times 17 \times 19 \times 23 \times 29 \times 31>2 \times 10^9$

所以,$N\leq 2\times 10^9$不可能有多于$10$个不同的质因子。
即使只包含最小的质数$2$,仍然有$2^{31}\gt 2\times 10^9$所以$ N\leq 2\times 10^9$的质因子不会超过$30$个。

$3.$

$ {\forall}x \in [1,N] $

$ x $为反质数的必要条件是:$x$分解质因数后可写作$2^{c_1}\times 3^{c_2}\times \ldots\ldots \times 29^{c_{10}}$,并且$c_1\geq c_2\geq c_3\geq \ldots\ldots\geq c_{10}\geq 0$。
通俗的讲,$x$的质因子是连续的若干个最小的质数,并且质数单调递增。

所以我们可以用搜索算法来搜出每一个质数的指数就$OK$了

code:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll n,p[11]= {0,2,3,5,7,11,13,17,19,23,29},ans=INT_MAX,total;
 5 void dfs(ll k,ll num,ll fir_sum,ll now_sum) {
 6     if(num>n)
 7         return;
 8     if(k==11) {
 9         if(now_sum>total) {
10             total=now_sum;
11             ans=num;
12         }
13         if(now_sum==total)
14             ans=min(ans,num);
15         return;
16     }
17     for(ll i=fir_sum; i>=0; i--) {
18         ll t=1;
19         for(ll j=1; j<=i; j++)
20             t*=p[k];
21         if(t>n) continue;
22         dfs(k+1,num*t,i,now_sum*(i+1));
23     }
24 }
25 int main() {
26     scanf("%lld",&n);
27     dfs(1,1,30,1);
28     printf("%lld\n",ans);
29     return 0;
30 }

 

posted @ 2021-02-06 13:36  谁伴我流浪  阅读(70)  评论(0编辑  收藏  举报