zoj2562--More Divisors(反素数模板)

More Divisors



Time Limit: 2 Seconds      Memory Limit: 65536 KB



Everybody knows that we use decimal notation, i.e. the base of our notation is 10. Historians say that it is so because men have ten fingers. Maybe they are right. However, this is often not very convenient, ten has only four divisors -- 1, 2, 5
and 10. Thus, fractions like 1/3, 1/4 or 1/6 have inconvenient decimal representation. In this sense the notation with base 12, 24, or even 60 would be much more convenient.

The main reason for it is that the number of divisors of these numbers is much greater -- 6, 8 and 12 respectively. A good quiestion is: what is the number not exceeding n that has the greatest possible number of divisors? This is the question you
have to answer.

Input:

The input consists of several test cases, each test case contains a integer n (1 <= n <= 1016).

Output:

For each test case, output positive integer number that does not exceed n and has the greatest possible number of divisors in a line. If there are several such numbers, output the smallest one.

Sample Input:

10
20
100

Sample Output:

6
12
60

从反素数的定义中可以看出两个性质:

(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小

(2)同样的道理,如果,那么必有

#include <cstdio>
#define LL long long
LL maxsum , bestnum , n ;
LL pri[20]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,53};  

void f(LL num,LL k,LL sum,LL limit)
{
    LL i , temp ;
    if( sum > maxsum )
    {
        maxsum = sum ;
        bestnum = num ;
    }
    if( sum == maxsum && bestnum > num )
        bestnum = num ;
    if(k == 20) return ;
    temp = num ;
    for(i = 1 ; i <= limit ; i++)
    {
        if( temp*pri[k] > n )
            break;
        temp = temp*pri[k] ;
        f(temp,k+1,sum*(i+1),i);
    }
    return ;
}
int main()
{
    while(scanf("%lld", &n)!=EOF)
    {
        bestnum = maxsum = -1 ;
        f(1,0,1,50);
        printf("%lld\n", bestnum);
    }
}
时间: 2024-10-05 22:56:46

zoj2562--More Divisors(反素数模板)的相关文章

ZOJ 1562 More Divisors 反素数

最裸的反素数问题.求不大于N的数约数最多的数是多少,如果有多个求最小值. 设x的约数个数为g(x),如果有某个正整数a有对于任意0<i<a有g(i)<g(a),则称a为反素数. g(x)的计算方法,先分解质因子x=a^b*c^d*e^f- g(x)=(b+1)*(d+1)*(f+1),即指数+1的乘积 反素数有性质: 一个反素数的质因子必然是从2开始的连续质数 2^t1*3^t2*5^t3*7^t4.....必然有t1>=t2>=t3>=.... 有了这些性质之后,就可

More Divisors(反素数)

More Divisors Time Limit: 2 Seconds      Memory Limit: 65536 KB Everybody knows that we use decimal notation, i.e. the base of our notation is 10. Historians say that it is so because men have ten fingers. Maybe they are right. However, this is often

Zoj 2562 More Divisors (反素数)

http://blog.csdn.net/whyorwhnt/article/details/19208535 http://blog.sina.com.cn/s/blog_893f611401016h84.html 看了老半天了,还是没完全看懂,暂搁置 756的约数个数: 756=2^2*3^3*7^1 (2+1)*(3+1)*(1+1)=24 这个逻辑我是懂的,算法还是没太明白 是不是要先去看些基础些的东西!!

p1186反素数(模板题)

描述 Description 如果一个自然数比所有比它小的自然数的约数个数都要多,那么我们就称这个数为一个反素数.例如,1.2.4.6.12和24都是反素数. 任务: 请写一个程序:○ 读入一个自然数n; ○ 找出不大于n的最大的反素数:○ 将结果输出. 输入格式 Input Format 只包含一行,为一个自然数n,1<n<2000000000. 输出格式 Output Format 输出唯一的一个整数--不大于n的最大反素数 样例输入 Sample Input 1000 样例输出 Samp

zoj2562:搜索+数论(反素数)

题目大意:求n以内因子数量最多的数  n的范围为1e16 其实相当于求n以内最大的反素数... 由素数中的 算数基本原理 设d(a)为a的正因子的个数,则 d(n)=(a1+1)(a2+1).....*(an+1); 又由反素数的性质2: p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=.... 我们可以指定搜索策略和剪枝 详见代码和注释 #include <iostream> #include<stdio.h> #include&

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使

反素数

反素数的定义: 对于任何的正整数n,其约数的个数记为f(n),例如f(6) = 4,如果某个正整数n满足,对于任意正整数i,0<i<n都有f(i)<f(n)那么称n为反素数. 两个性质: (1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小 (2)同样的道理,如果,那么必有 根据这2个性质可以找到反素数.可以用搜索来查找. 模板: #include<map> #include<queue> #include<s

poj 2886 线段树的更新+反素数

Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description N children are sitting in a circle to play a game. The children are numbered from

反素数 -- 数学

反素数就是区间内约数个数最多的那个数. 在ACM题目里, 一般是求约数最多而且数字最小的那个数,[1--n] 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数[beign,end] 1和3有区别吗?有,1可以加速,3只能暴力 先说下思路 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. (2)我们可以知道,计算约数的个数和质因数分解有着很大的联系: 若Q的质因数分解为:Q=p1^k1*p2^k2*…*pm^km(p1…pm为素数,k1…km≥1),则Q有(k1+1