反素数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6686 Accepted Submission(s): 4001
Input
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
Output
问题链接:HDU2521 反素数。
题意简述:参见上文。
问题分析:
题目为反素数,实际上与素数似乎没有关系,不过是一个定义而已。
关键是计算整数的因子个数,求区间的中的x使得g(x)即x的因子个数为最大。
程序说明:本程序采用ACM题最普通的套路,为避免重复计算就先打表。把功能封装到函数中也是一种值得推荐的做法。
AC的C语言程序如下:
/* HDU2521 反素数 */ #include <stdio.h> #define N 5000 int apcount[N+1]; /* antiprime count */ int getapcount(int n) { int count = 1, i; for(i=2; i<=n/2; i++) if(n % i == 0) count++; /* 因子个数计数 */ if(n != 1) count++; /* 不是1则自身因子需要加上 */ return count; } void setapcount(int n) { int i; apcount[0] = 0; for(i=1; i<=n; i++) apcount[i] = getapcount(i); } int main(void) { setapcount(N); int n, a, b, max, maxval, i; scanf("%d", &n); while(n--) { scanf("%d%d", &a, &b); max = maxval = 0; for(i=a; i<=b; i++) if(apcount[i] > maxval) { maxval = apcount[i]; max = i; } printf("%d\n", max); } return 0; }