1053: [HAOI2007]反素數ant
阿新 • • 發佈:2018-06-17
void class include 正是 discuss 包括 times mit sca Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4124 Solved: 2456
[Submit][Status][Discuss]
×30(0≤i≤4),這種情況,因數還包括了1和48自身
還要在小小的理解一下題目g(x)>g(i) 0<i<x
這裏就是說,當g(x)==g(i) 0<i<x,這種情況是不成立的,要去較小值i
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
1000Sample 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,2i1 #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}; 8int 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