您的位置:首页 > 编程语言 > C语言/C++

[hihoCoder 1187] Divisors (微软预科生计划-探星夏令营在线测试)

2016-04-04 21:58 357 查看



描述

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)

注意数据范围,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微软 c++ 校园招聘