P1820 【寻找AP数】

超级题目链接

这题程序实现其实并不难,难的是数学的思想及证明,这在真正的比赛考场上其实是不容易想到的

去年的年赛题目也是在往更难的数学思想上靠拢,并不是一味的编程,需要一定的数学基础

这个。。数学性质我再提一下吧,有兴趣的可以自己尝试证一下~~

_性质一_

一个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 }

呐呐,就是这样了哦,新人博客,多多支持一下吧,嘻嘻~~~

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11122033.html