现在的位置: 首页 > 综合 > 正文

hdu 2521 反素数

2012年10月23日 ⁄ 综合 ⁄ 共 905字 ⁄ 字号 评论关闭
Problem Description
反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。
 

Input
第一行输入n,接下来n行测试数据
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
 

Output
输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.
 

Sample Input
3
2 3
1 10
47 359
 

Sample Output
2
6
240

Hint

2的因子为:1 2
10的因子为:1 2 5 10

N只有5000,完全可以直接打表

//类似于素数筛选法
#include <stdio.h>
int s[5050]={0};
int main()
{
    int i,j,n,a,b,c;
    for (i=1;i<5050;i++)
        for (j=1;j*i<5050;j++)      //对于任何一个数,有一个因子就加一
            s[i*j]++;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d",&a,&b);
        c=a;
        for (i=a;i<=b;i++)
            if (s[i]>s[c]) c=i;
        printf ("%d\n",c);
    }
    return 0;
}
//直接算因数个数
#include<iostream>
using namespace std;
int c[5050];
void init()
{
	memset(c,0,sizeof(c));
	c[1]=1;c[2]=2;c[3]=2;
	for(int i=4;i<=5001;i++)
	{
		//cout<<i<<' '<<c[i]<<endl;
		for(int j=1;j<=i/2;j++)
			if(i%j==0)
				c[i]++;
		c[i]++;
	}
}
int main()
{
	init();
	int cas,n,m;
	cin>>cas;
	while(cas--)
	{
		scanf("%d %d",&m,&n);
		int max=c[m],t=m;
		for(int i=m+1;i<=n;i++)
		{
			if(c[i]>max)
			{
				max=c[i];
				t=i;
			}
		}
		printf("%d\n",t);
	}
	return 0;
}

抱歉!评论已关闭.