[SDOI2005]反素数ant

题目描述

对于任何正整数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的最大的反质数。

输入输出样例

输入样例#1:
1000
输出样例#1:
840
数学题
打个表就可以发现、

1 1 2 1*2

4 2*2

6 2*3

12 4*3

24 12*2

36 12*3

48 24*2

60 12*5

120 24*5

180 60*3

剩下的就是简单的dfs了

 

240 120*2

360 180*2

720 360*2

840 120*7

1260 180*7

1680 840*2

2520 360*7

5040 2520*2

7560 2520*3

10080 5040*2

15120 5040*3

开始看错题目写的递推水了20分后来看了题解发现当有多组解时求最小值

每一个反质数都是某一个已求出的反质数与一个质数的乘积

#include<cstdio>


typedef long long LL;

int prime[15] ={0,2,3,5,7,11,13,17,19,23,29,31,37,41};

int n;
int ans,maxys=0;

void dfs(LL now,int ys,int cnt)
{
    if(ys>maxys||(ys==maxys&&now<ans) )ans=now,maxys=ys;
    if(cnt==14)return;
    LL a=1;
    for(int i=0;;i++)
    {
        if(a*now>n)break;
        dfs(now*a,ys*(i+1),cnt+1);
        a*=prime[cnt];
    }
}

int main()
{
    scanf("%d",&n);
    
    dfs(1,1,1);
    
    printf("%d",ans);
    return 0;
}

 

 

posted @ 2017-05-23 18:09  zzzzx  阅读(252)  评论(0编辑  收藏  举报