JZOJ3020. 最多的约数(divisor)
Description
WZK是个数学狂热爱好者。最近他又想出了一道题目来考大家。题目很简单,给定一个正整数n,对于所有不超过n的正整数,找到包含约数最多的一个数。如果有多个这样的数,那么回答最小的那个。
Input
输入一行一个正整数n,其中1 ≤ n ≤ 10^16。
Output
输出仅一行,一个满足上述条件的正整数。
Sample Input
100
Sample Output
60
Data Constraint
有30%的数据,n不超过1000。
有50%的数据,n不超过1000000。
有100%的数据,1 ≤ n ≤ 10^16
Solution
考试时想到了正解,没仔细考虑,感觉T飞就没打>﹏<
水题一道
正解递归枚举。。。
首先,一个数可以分解为质因数,从而计算因数个数
所以可以枚举质因数的个数
对于两个质因数p1,p2,以及对应个数a1,a2,如果p1<p2且a1>a2,那么这肯定不是最优解(自行动脑)
所以可以递减枚举,递归过程中更新下ans就行
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int X=19;
const ll p[X+1]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67};
ll n,ans=0,Max=0;
void dfs(int x,int last,int c,ll s)
{
if ((c==Max && s<ans)||c>Max) Max=c,ans=s;
ll S=s*p[x];
for (int i=1;i<=last && S<=n;i++,S*=p[x])
dfs(x+1,i,c*(i+1),S);
}
int main()
{
scanf("%lld",&n);
dfs(1,9999,1,1);
printf("%lld\n",ans);
return 0;
}