JZOJ 3020. 【NOIP2012模拟10.9】最多的约数

题目

Description

 WZK是个数学狂热爱好者。最近他又想出了一道题目来考大家。题目很简单,给定一个正整数n,对于所有不超过n的正整数,找到包含约数最多的一个数。如果有多个这样的数,那么回答最小的那个。

 

Input

         输入一行一个正整数n,其中1 ≤ n ≤ 10^16。

Output

    输出仅一行,一个满足上述条件的正整数。
 

Sample Input

100

Sample Output

60
 

Data Constraint

 
 

Hint

有30%的数据,n不超过1000。

有50%的数据,n不超过1000000。

          有100%的数据,1 ≤ n ≤ 10^16

 

分析

  先打个素数表,然后根据表打出跟多约数的数

 

代码

 1 #include<bits/stdc++.h>
 2 #define L long long
 3 using namespace std;
 4 L n,pi,ans,num;
 5 int p[10005];
 6 bool flag[1000010];
 7 void fun()
 8 {
 9     for(int i=2;i<=1000000;i++)
10      if(!flag[i])
11      {
12        p[++pi]=i;
13        for(int j=2;j<=1000000/i;j++)
14         flag[j*i]=1;
15      }
16 }
17 void dfs(L x,int lev,int t,int s)
18 {
19     if(t>num||(t==num&&x<ans)) ans=x,num=t;
20     int j=0,l=1,q;
21     L i=x;
22     while(j<s)
23     {
24       j++,l++;
25       if(n/i<p[lev]) break;
26       q=t*l;
27       i*=p[lev];
28       if(i<=n) dfs(i,lev+1,q,j);
29     }
30 }
31 int main()
32 {
33     fun();
34     cin>>n;
35     dfs(1,1,1,30);
36     cout<<ans;
37 }
为何要逼自己长大,去闯不该闯的荒唐
原文地址:https://www.cnblogs.com/zjzjzj/p/10698953.html