1. 程式人生 > >1053: [HAOI2007]反素數ant

1053: [HAOI2007]反素數ant

void class include 正是 discuss 包括 times mit sca

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4124 Solved: 2456
[Submit][Status][Discuss]

Description

  對於任何正整數x,其約數的個數記作g(x)。例如g(1)=1、g(6)=4。如果某個正整數x滿足:g(x)>g(i) 0<i<x ,則稱x為反質數。例如,整數1,2,4,6等都是反質數。現在給定一個數N,你能求出不超過N的最大的反質數麽

Input

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

Output

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

Sample Input

1000

Sample Output

840 這裏要先知道一個結論:   因數的個數=質因數的次方+1的乘積 如:48=24×31 則48的因數個數為(4+1)×(1+1)=10,因此48有10個因數 分別為:1,2,3,4,6,8,12,16,24,48 證明: 我們都知道,所有的合數,都能分解為若幹質數的乘積,如:48=2*2*2*2*3 而因數正是以乘積的形式聯系起來的,剛好滿足了我們所要求的東西 那麽為什麽要+1呢? 其實這裏就是一個排列組合問題,還是按48來說,就是還要有20×31,2i
×30(0≤i≤4),這種情況,因數還包括了1和48自身
還要在小小的理解一下題目g(x)>g(i) 0<i<x 這裏就是說,當g(x)==g(i) 0<i<x,這種情況是不成立的,要去較小值i
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 #define LL long long
 6 
 7 int dist[20]={2,3,5,7,11,13,17,19,23,29,31};
 8
int n,ans,num; 9 10 void dfs(LL t,int k,int tmp) 11 { 12 if(k==11) 13 { 14 if(tmp>num){ans=t;num=tmp;} 15 if(t<ans&&tmp==num){ans=t;num=tmp;} 16 return; 17 } 18 for(int i=0;i<31;i++) 19 { 20 dfs(t,k+1,tmp*(i+1)); 21 t*=dist[k]; 22 if(t>n) break; 23 } 24 } 25 26 int main() 27 { 28 scanf("%d",&n); 29 dfs(1,0,1); 30 printf("%d",ans); 31 return 0; 32 }


1053: [HAOI2007]反素數ant