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].
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
Output
输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.
Sample Input
3
2 3
1 10
47 359
Sample Output
2
6
240
N只有5000,完全可以直接打表Hint
2的因子为:1 2
10的因子为:1 2 5 10//类似于素数筛选法 #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; }