这题程序实现其实并不难,难的是数学的思想及证明,这在真正的比赛考场上其实是不容易想到的
去年的年赛题目也是在往更难的数学思想上靠拢,并不是一味的编程,需要一定的数学基础
这个。。数学性质我再提一下吧,有兴趣的可以自己尝试证一下~~
_性质一_
一个AP数分解质因数后,它的因子必为连续质数
_性质二_
一个AP数分解质因数后,因子越小,指数越大
实际上,我觉得这两个数学性质都蛮好想的,个人感觉不用看证明。
另外,编程时注意以下几点:
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 }
呐呐,就是这样了哦,新人博客,多多支持一下吧,嘻嘻~~~