反素数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2858 Accepted Submission(s): 1637
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
思路:给出区间[a,b],求该区间里因子个数最大的数。因为任何一个数N都可以表示为N = p1^e1*p2^e2*p3^e3...pn^en,其中p1,p2,...,pn为不同的素数,那么它所含有的因子数为(1+e1)*(1+e2)*...(1+en);直接暴力即可。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 int prime[5001]; 8 bool vis[5001]; 9 int main() 10 { 11 memset(vis,0,sizeof(vis)); 12 for(int i=2; i<=75; i++) 13 { 14 if(!vis[i]) 15 { 16 for(int j=i*i; j<=5000; j+=i) 17 vis[j] = true; 18 } 19 } 20 int idx = 0; 21 for(int i=2; i<=5000; i++) 22 if(!vis[i]) 23 prime[idx++] = i; 24 int n; 25 scanf("%d",&n); 26 while(n--) 27 { 28 int a,b; 29 scanf("%d%d",&a,&b); 30 int sum,ans; 31 int Max = 0; 32 int time; 33 for(int num = a; num<=b; num ++) 34 { 35 sum = 1; 36 int temp = num; 37 for(int i=0; i<idx; i++) 38 { 39 time = 0; 40 while(temp % prime[i] == 0) 41 { 42 temp /= prime[i]; 43 time ++; 44 } 45 sum *= (1+time); 46 if(temp == 1) 47 break; 48 } 49 if(sum > Max) 50 { 51 Max = sum; 52 ans = num; 53 } 54 } 55 printf("%d\n",ans); 56 } 57 return 0; 58 }