hdu 2521 反素数(打表)
Posted AC菜鸟机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2521 反素数(打表)相关的知识,希望对你有一定的参考价值。
反素数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5723 Accepted Submission(s): 3355
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
本来想找个反素数的题目练练手,结果碰到一水题。打表即可,,不过我这里也把反素数的模板贴上来。
#include <iostream> #include <stdio.h> using namespace std; int cnt[5005]; void init(){ for(int i=1;i<=5000;i++){ for(int j=1;j*j<=i;j++){ if(i%j==0){ if(j*j==i) cnt[i]++; else{ cnt[i]+=2; } } } } } int main() { init(); int tcase; scanf("%d",&tcase); while(tcase--){ int a,b; scanf("%d%d",&a,&b); int MAX = -1,res=a; for(int i=a;i<=b;i++){ if(cnt[i]>MAX) { MAX = cnt[i]; res = i; } } printf("%d\n",res); } return 0; }
以下是求[1,n]内反素数的模板。参考了acreamer大神:http://blog.csdn.net/ACdreamers/article/details/25049767
/**此模板可求[1,b]之间的反素数*/ #include<stdio.h> #include<string.h> #include <iostream> #include <algorithm> #include <stdlib.h> using namespace std; typedef unsigned long long ULL; const ULL INF = ~0ULL; int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int ans,n; int best; void dfs(int dept,int limit,ULL tmp,int num) { ///到叶子结点,返回 if(dept >= 16) return; ///num记录的因子个数,如果遇到更小的,就更新 if(num > best) { best = num; ans = tmp; } ///当因子个数相同时,取值最小的 if(num == best && ans > tmp) ans = tmp; for(int i=1;i<=limit;i++) { if(n/p[dept] < tmp) break; dfs(dept+1,i,tmp *= p[dept],num*(i+1)); } } int main() { int tcase; scanf("%d",&tcase); while(tcase--){ scanf("%d",&n); ans =INF; best = 0; dfs(0,63,1,1); ///最大不会超过INF < 2^63 printf("%d\n",ans); } return 0; }
以上是关于hdu 2521 反素数(打表)的主要内容,如果未能解决你的问题,请参考以下文章