题目背景
正整数n是无穷的,但其中有些数有神奇的性质,我们给它个名字——AP数。
题目描述
对于一个数字i是AP数的充要条件是所有比它小的数的因数个数都没有i的因数个数多。比如6的因数是1 2 3 6 共计有4个因数。它就是一个AP数(1-5的因数个数不是2就是3)。我们题目的任务就是找到一个最大的,且不超过n的AP数。
输入格式
每个测试点可能拥有多组数据。
对于每一行有一个n,如题目所描述
输出格式
对于每一行输出最大的且不超过n的AP数
输入输出样例
输入 #1
1000
输出 #1
840
说明/提示
n<=15 0000 0000
分析:
这题要用到不少数学性质和证明,反正我记得这题我们老师讲了一下午,详细看https://www.luogu.org/problemnew/solution/P1820(话说这里面的题解(除了打表)好像都是我们班的。。。)
CODE:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 long long int n,ap,fap; 6 const int p[11]={0,2,3,5,7,11,13,17,19,23,29}; 7 void work(int k,long long x,int fx,int limit){ 8 if (k>n) return ; 9 if (fx>fap&&x<=n) fap=fx,ap=x; 10 if (x<ap&&fx==fap) ap=x; 11 for (int i=1;i<=limit;++i){ 12 x*=p[k]; 13 if (x>n) break; 14 work(k+1,x,fx*(i+1),i); 15 } 16 } 17 int main(){ 18 while(scanf("%d",&n)!=EOF){ 19 ap=fap=0; 20 work(1,1,1,20); 21 cout<<ap<<endl; 22 } 23 return 0; 24 }