描述
Given an integer n, for all integers not larger than n, find the integer with the most divisors. If there is more than one integer with the same number of divisors, print the minimum one.
输入
One line with an integer n.
For 30% of the data, n ≤ 103
For 100% of the data, n ≤ 1016
输出
One line with an integer that is the answer.
样例输入
100
样例输出
60
描述
Given an integer n, for all integers not larger than n, find the integer with the most divisors. If there is more than one integer with the same number of divisors, print the minimum one.
输入
One line with an integer n.
For 30% of the data, n ≤ 103
For 100% of the data, n ≤ 1016
输出
One line with an integer that is the answer.
100
60
题解:暴力必超时。每个数可以表示成素数相乘。n = p1^k1 * p2^k2 * ... * pm^km
(p1 < p2 < ... < pm)
易见,n的因子数为
(1+k1)*(1+k2)*...*(1+km)
(p1 < p2 < ... < pm)
易见,n的因子数为
(1+k1)*(1+k2)*...*(1+km)
注意数据范围,long long型!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<string>
#include<limits.h>
#include<unordered_map>
#include<map>
#include<stack>
using namespace std;
bool prime[101];
int pri[101];
int k;
long long res,n,ans;
void init() {
memset(prime,true,sizeof(prime));
pri[0]=2;k=1;
for(int i=3;i<=100;i+=2) {
if(prime[i]) {
pri[k++]=i;
}
for(int j=3;i*j<=100;j+=2) {
prime[i*j]=false;
}
}
}
void dfs(int cnt,long long tmp,long long tmp_count,int kk) {
if(tmp*pri[cnt]>=n) {
if(tmp_count>ans) {
ans=tmp_count;
res=tmp;
}
if(tmp_count==ans&&tmp<res) {
res=tmp;
}
return;
}
for(int i=1;i<=k&&tmp*pri[cnt]<=n;i++) {
tmp*=pri[cnt];
dfs(cnt+1,tmp,tmp_count*(i+1),i);
}
}
int main()
{
scanf("%lld",&n);
init();
res=n;
ans=0;
dfs(0,1,1,100);
printf("%lld\n",res);
return 0;
}