zoukankan      html  css  js  c++  java
  • 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 }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    重要的环境变量
    常用的转义字符
    常用系统工作命令
    栈 队列 和 双向队列
    时间
    默认值字典
    Counter
    random
    22 内置常用模块01
    super
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10698953.html
Copyright © 2011-2022 走看看