bzoj1053(反素數)
阿新 • • 發佈:2018-05-22
std ID color sample scanf sca typedef oid -h
Submit: 7 Solved: 5
[Submit][Status][Web Board]
如果某個正整數 x 滿足:對於任意的 0<i<x,都有 g(x)>g(i),那麽稱 x 為反質數。例如整數 1,2,4,6 等都是反質數。
現在給定一個數 N(1≤N≤2*〖10〗^9 ),請求出不超過N的最大的反質數。
不超過N的最大的反質數。
4790: Lydsy1053 反素數
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
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(反素數)