1. 程式人生 > >bzoj1053(反素數)

bzoj1053(反素數)

std ID color sample scanf sca typedef oid -h

4790: Lydsy1053 反素數

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 7 Solved: 5
[Submit][Status][Web Board]

Description

對於任何正整數 x,其約數的個數記作g(x)。例如g(1)=1,g(6)=4。
如果某個正整數 x 滿足:對於任意的 0<i<x,都有 g(x)>g(i),那麽稱 x 為反質數。例如整數 1,2,4,6 等都是反質數。
現在給定一個數 N(1≤N≤2*〖10〗^9 ),請求出不超過N的最大的反質數。

Input

一個數N(1<=N<=2,000,000,000)。

Output

不超過N的最大的反質數。

Sample Input

1000

Sample Output

840

HINT

Source

引理:1~n中最大的反素數,就是1~n中約數個數最多的數中最小的一個

1~n中的任意數x,的約數不可能超過十個

對於x屬於1~n,若x為反素數,則將x質因數分解後次方單調遞減

所以,直接爆搜

#include<cstdio>
using namespace std;

typedef  long long ll;

int s[100];
int ansnum,anssum;
int n;
int prime[20]={1,2,3,5,7,11,13,17,19,22,23
,29,31}; void dfs(ll num,ll sum,int x){//num為約數個數,sum為現在總和,x為到第幾個素數 if(x>12) return ; if(num>ansnum || (num==ansnum&&sum<anssum)){ ansnum=num; anssum=sum; //return ; } s[x]=0; while(sum*prime[x]<=n&&s[x]<s[x-1]){ s[x]
++; //ll next=num*(s[x]+1); dfs(num*(s[x]+1),sum*=prime[x],x+1); } } int main(){ scanf("%d",&n); s[0]=10000; dfs(1,1,1); printf("%d\n",anssum); return 0; }

bzoj1053(反素數)