[HAOI2007]反素数

Posted lsyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HAOI2007]反素数相关的知识,希望对你有一定的参考价值。

题目描述

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

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

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

输入格式

一个数N(1<=N<=2,000,000,000)。

输出格式

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


对于一个反质数n

 

一定有n=p1^(c1)+p2^(c2)+……+pm^(cm);
其中p1……pm为依次递增的质数
c1……cm为依次严格不上升的序列
 
根据范围可得p最多有10个不同的质数
 
暴力搜索就好
#include<bits/stdc++.h>
#define re return
#define ll long long
#define inc(i,l,r) for(int i=l;i<=r;++i) 
using namespace std;
template<typename T>inline void rd(T&x)

    char c;bool f=0;
    while((c=getchar())<0||c>9)if(c==-)f=1;
    x=c^48;
    while((c=getchar())>=0&&c<=9)x=x*10+(c^48);
    if(f)x=-x;


ll n,m,ans,ans_cnt,a[20]=0,2,3,5,7,11,13,17,19,23,29;

inline void dfs(ll x,ll up,ll y,ll cnt)//x:当前数,up :上界,y:第几层 

    if(cnt>ans_cnt||(cnt==ans_cnt&&x<ans))
    
        ans_cnt=cnt;
        ans=x;
    
    if(y==11)re ;
    
    ll now=1;
    dfs(x,0,y+1,cnt);
    
    inc(i,1,up)
    
        now*=a[y];
        if(now*x>n)break;
        dfs(now*x,i,y+1,cnt*(i+1));
    

int main()

    rd(n);
    dfs(1,31,1,1);
    printf("%lld",ans);
    re 0;

 

以上是关于[HAOI2007]反素数的主要内容,如果未能解决你的问题,请参考以下文章

题解 P1463 [POI2002][HAOI2007]反素数

[HAOI2007]反素数ant

bzoj1053 [HAOI2007]反素数ant

Luogu P1463 [HAOI2007]反素数ant:数学 + dfs反素数

BZOJ 1053[HAOI2007]反素数ant

[HAOI2007]反素数