Problem Description
反素数就是满足对于任意
i(0<i<x)
i
(
0
<
i
<
x
)
,都有
g(i)<g(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
公式:
然后就是暴力求解,反正是5000,至于更大的话,懒得想,反正不会QAQ
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define ll long long
int nprime[5005],ctprim,prime[5005];
void isprime()
{
for(int i=2;i<=5000;i++)
{
if(!nprime[i])
{
prime[++ctprim]=i;
}
for(int j=1;j<=ctprim&&prime[j]*i<=5000;j++)
{
nprime[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
int yz[5005],sum[5005];
void init()
{
isprime();
for(int i=1;i<=5000;i++)
{
int ct=0;
int x=i;
for(int j=1;j<=ctprim;j++)
{
if(x==1)
break;
int sum=0;
while(x%prime[j]==0)
x/=prime[j],sum++;
if(sum)
yz[++ct]=sum;
}
int all=1;
for(int i=1;i<=ct;i++)
all*=(yz[i]+1);
sum[i]=all;
}
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int l,r;
scanf("%d%d",&l,&r);
int maxn=0,ans;
for(int i=l;i<=r;i++)
{
if(sum[i]>maxn)
ans=i,maxn=sum[i];
}
printf("%d\n",ans);
}
return 0;
}