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

it2022-05-10  61

题目

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


最新回复(0)