P1820 【尋找AP數】

超級題目連接ios

這題程序實現其實並不難,難的是數學的思想及證實,這在真正的比賽考場上實際上是不容易想到的編程

去年的年賽題目也是在往更難的數學思想上靠攏,並非一味的編程,須要必定的數學基礎spa

這個。。數學性質我再提一下吧,有興趣的能夠本身嘗試證一下~~code

_性質一_blog

一個AP數分解質因數後,它的因子必爲連續質數get

_性質二_博客

一個AP數分解質因數後,因子越小,指數越大數學

實際上,我以爲這兩個數學性質都蠻好想的,我的感受不用看證實。string

另外,編程時注意如下幾點:it

1)一個AP數的質因子數不會超過10,否則大於數據範圍

2)用long long型變量存儲答案,否則會爆

3)指數遞減

代碼:

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 long long n,ap,fap;//ap是要輸出的答案,fap是答案的質因子數
 8 int mm[]={2,3,5,7,11,13,17,19,23,29};//可能的質因子
 9 void dfs(long long num,int fnum,int i,int j){
10     if(fap<fnum||(fap==fnum&&ap>num)){//更改輸出答案的條件
11         fap=fnum;
12         ap=num;
13     }
14     int t=1;
15     while(t<=j&&num*mm[i]<=n){//直接判斷
16         num*=mm[i];
17         dfs(num,fnum*(t+1),i+1,t);
18         t++;
19     }
20     return;
21 } 
22 int main(){
23     while(scanf("%d",&n)!=EOF){//多組數據
24         ap=fap=0;//賦初值,否則會錯的很慘
25         dfs(1,1,0,20);
26         cout<<ap<<endl;
27     }
28     return 0;
29 }

吶吶,就是這樣了哦,新人博客,多多支持一下吧,嘻嘻~~~

相關文章
相關標籤/搜索