寻找AP数

题目背景

正整数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 }

 

posted @ 2019-08-12 12:24  Sword_Art_Online  阅读(260)  评论(0编辑  收藏  举报