华师一附中OI组
标题:
1-m中那个数的约数最多
[打印本页]
作者:
admin
时间:
2018-5-1 14:38
标题:
1-m中那个数的约数最多
1、最简单和直观的方法是对于每个数字,统计他的约数的个数,记录约数最多的数,这样复杂度大约在n2级别,优化下,也大约在nlnn。(想想怎么优化)
2、直接生成法,任何数都可以表示成一个唯一分解式子 N=2^x1*3^x2*5^x3******K^Xk。其中2,3,5,**K都是质数,而且k不会太大,然后x1---xk的范围也很好确定,搜索不断调整就是。
作者:
admin
时间:
2018-5-1 14:38
#include<iostream>
using namespace std;
int l,r,s,i,j,maxy,maxi;
int main()
{
cin>>l>>r;
maxx=maxy=0;
for (i=l; i<=r; i++)
{
s=0;
for (j=1; j<=i; j++)
if (i%j==0) s=s+1;
if (s>maxy){maxy=s;maxi=i;} //约数多少个,这个数字是几都要记录下来
}
cout<<maxy<<' '<<maxi;
return 0;
}
复制代码
作者:
admin
时间:
2018-5-1 14:39
#include<iostream>
using namespace std;
int n;
int p[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; //前7个质数的乘积已经大于10^5说明不可能有超过7个质因子
long long maxs=1; //约数最多的那个数
int maxk=0;//最多的约数个数
void mysearch(int i,long long s,long long j,long long k)
//i表示深度(搜索到了第几个质因子)
//s表示当前因子最多的那个数字
//j表示最多含有多少个第i层的因子
//k表示当前最多因子的个数
{
int jj;
if(i>=9) return;
if (k>maxk){maxs=s;maxk=k; cout<<maxs<<' '<<maxk<<endl;}
for (jj=1;jj<=j;jj++)
{
s=s*p[i];
if (s<=n) mysearch(i+1,s,jj,k*(jj+1));
}
}
int main()
{
n=100000;
mysearch(0,1,30,1);
cout<<maxs<<' '<<maxk;
}
复制代码
作者:
ZMQ
时间:
2018-5-26 21:27
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2