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].
 

 

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 反素数(打表)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4548 美素数 素数题解

HDU 2136 Largest prime factor (素数打表。。。)

hdu-1431 素数回文

hdu 1016 dfs+素数表打表

HDU4548 美素数打表前缀和

hdu 1999 不可摸数 筛选素数 两次打表