思路:
其实跟反素数没有什么关系,就是让你求区间里的数的因数的个数最多的那个值,如果有多个符合,取最小。
分解质因数,比如24可以分解为:
23∗31
所以24的所有因数的个数就是(3+1)*(1+1) = 8
仔细考虑一下,每个质因子的幂指数都可以选择
[0,x]
反素数
定义:
对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意
i(0<i<x)
都有
g(i)<g(x)
则称x为反素数
两条性质:
1,一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小。
(证明:反证法,n为反素数,如果不是从2开始的连续若干个质数的话,假设缺x,把其中比x大的某个质因子换成x,设这个新数为m,所以g(m)= g(n),相悖。)
2,
p=2t1∗3t2∗5t3∗7t4.....
必然
t1>=t2>=t3>=....
(证明:反证法,如果某
tx<ty(x<y)
那么将tx和ty换个位置就能得到和这个数的因子的数量相等的,比这个数小的一个数,相悖。)
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int a[5050];
int main()
{
//freopen("output.txt","w",stdout);
int t;
int l,r;
int ans;
int temp,m;
a[1] = 1;
for(int i = 2;i <= 5000;i++){
int now = i;
int nn = 0;
temp = 1;
for(int j = 2;j <= now;j++){
if(now % j == 0){
nn++;
now /= j;
while(now % j == 0){
nn++;
now /= j;
}
temp *= (nn+1);
nn = 0;
}
}
a[i] = temp;
}
scanf("%d",&t);
while(t--){
scanf("%d%d",&l,&r);
m = a[l];
ans = l;
for(int i = l+1;i <= r;i++){
if(a[i]>m){
m = a[i];
ans = i;
}
}
printf("%d\n",ans);
}
return 0;
}