找有最多个约数的数

一个数的素数因子分解是数论里面的基本问题,我们在课堂上专门讨论过这样的问题,大家也做过实验。不过今天我们要讨论的问题更加简单,只讨论某一个数的约数,假定给你任意一个数,让你找出这个数的所有约数,如6,它有1、2、3、6一共4个约数,显然这是一个非常简单的问题,但我们今天要稍微变化一下,我们请你在一定范围内找出约数最多的那个数,有点麻烦的是这个数的数值本身可能不算小。

Input
本问题有多组测试数据,对于每一组测试数据,输入只有一行,共两个正整数F,T其中1<=F<=T<=10000000。

Output
输出有两行,第一行由三部分组成,第一部分是“[F,T]”,第二部分是区间范围内有最多约数的那个数,第三部分是约数的个数,三部分之间用一个空格隔开,行尾没有空格;第二行是对应的约数,从小到大排列,中间用一个空格隔开,末尾没有空格。当符合要求的答案不唯一时,输出有最多约数时本身数最小的那个。

Sample Input
3 10
500 550

Sample Output
[3,10] 6 4
1 2 3 6
[500,550] 504 24
1 2 3 4 6 7 8 9 12 14 18 21 24 28 36 42 56 63 72 84 126 168 252 504

#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
const int MAXN=10000005;
int d[MAXN],prim[6554590];
int n,x,l,r;
bool is_prim[MAXN];
int tot;
int get_mu(int x,int y)
{
    int ans=0;
    while(x%y==0)
    {
        ++ans;
        x/=y;
    }
    return ans;
}
void jzp_table(int n)
{
    tot=0;
    is_prim[0]=is_prim[1]=false;
    d[1]=1;
    for(int i=2;i<=n;++i)
    {
        is_prim[i]=true;
    }
    for(int i=2;i<=n;++i)
    {
        if(is_prim[i])
        {
            prim[++tot]=i;
            d[i]=2;
        }
        for(int j=1;j<=tot;++j)
        {
            if(i*prim[j]>n)break;
            is_prim[i*prim[j]]=false;
            if(i%prim[j]==0)
            {
                int num=get_mu(i,prim[j]);
                d[i*prim[j]]=d[i]/(num+1)*(num+2);
                break;
            }
            else
            {
                d[i*prim[j]]=d[i]*d[prim[j]];
            }
        }
    }
}
int main()
{
    jzp_table(10000000);
    while(scanf("%d %d",&l,&r)!=EOF)
    {
        int maxans=0;
        int maxpos;
        for(int i=l;i<=r;++i)
        {
            if(maxans<d[i])
            {
                maxans=d[i];
                maxpos=i;
            }
        }
        printf("[%d,%d] %d %d\n",l,r,maxpos,maxans);
        int cnt=1;
        for(int i=1;i<=maxpos;++i)
        {
            if(maxpos%i==0)
            {
                printf("%d%c",i,cnt==maxans?'\n':' ');
                ++cnt;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44061561/article/details/94611254