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

有了这些性质之后,就可以用dfs搜索质因子来求值了

搜索过程如下:

在保证性质1和2的情况下构造出一定长度的指数数组,指数数组的每一个情况就相当于一个数,即1-x当中x拥有最多的约数(但不保证唯一),并且dfs的过程中也可以得到约数个数,约数个数相等的时候,得到的最小的值就是反素数,也就是本题所要求的解。

#include <cstdio>
#include <sstream>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <cctype>
#include <ctime>
#include <set>
#include <climits>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <cmath>
#include <string>
#include <list>

#define INPUT_FILE "in.txt"
#define OUTPUT_FILE "out.txt"

using namespace std;

typedef long long LL;
const int INF = INT_MAX / 2;

void setfile() {
    freopen(INPUT_FILE,"r",stdin);
    freopen(OUTPUT_FILE,"w",stdout);
}

int prime[20] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
int times[20];
LL ans,anscnt;

void dfs(LL curval,LL curcnt,int nowt,LL lim) {
    if(nowt >= 20) return;
    if(curcnt > anscnt) {
        anscnt = curcnt;
        ans = curval;
    }
    if(curcnt == anscnt) {
        ans = min(curval,ans);
    }
    for(int i = 1;i < 80;i++) {
        if(nowt == 0 || i <= times[nowt - 1]) {
            curval *= prime[nowt];
            curcnt = curcnt / i * (i + 1);
            times[nowt] = i;
            if(curval > lim) return;
            dfs(curval,curcnt,nowt + 1,lim);
        }
        else break;
    }
}

int main() {
    LL lim;
    while(cin >> lim) {
        memset(times,0,sizeof(times));
        ans = anscnt = 0;
        dfs(1,1,0,lim);
        cout << ans << endl;
    }
    return 0;
}

ZOJ 1562 More Divisors 反素数

时间: 2024-11-05 06:11:31

ZOJ 1562 More Divisors 反素数的相关文章

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 这个逻辑我是懂的,算法还是没太明白 是不是要先去看些基础些的东西!!

ZOJ 2562 HDU 4228 反素数

反素数: 对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4. 如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数. ZOJ 2562 反素数 因为写了POJ 2886的线段树,然后里面有反素数,以前没遇到过,所以先搞这两题普及一下知识再说. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&

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

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 1562 反素数 附上个人对反素数性质的证明

反素数的定义:对于不论什么正整数,其约数个数记为.比如,假设某个正整数满足:对随意的正整 数.都有,那么称为反素数. 从反素数的定义中能够看出两个性质: (1)一个反素数的全部质因子必定是从2開始的连续若干个质数.由于反素数是保证约数个数为的这个数尽量小 (2)相同的道理,假设,那么必有 个人理解性证明: 对(1)如果不是从2開始,那么如果n的最小素因素是k,把k换成2,2的次数仍等于k的次数,得到N,可知,N<n,而且f(n)==f(N).与n是反素数矛盾 对(2)如果ti<tj   ti,

ZOJ 2562 反素数

在讲解反素数之前,我们先来看反素数的概念. 反素数的定义:对于任何正整数,其约数个数记为,例如,如果某个正整数满足:对任意的正整 数,都有,那么称为反素数. 从反素数的定义中可以看出两个性质: (1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小 (2)同样的道理,如果,那么必有 在ACM竞赛中,最常见的问题如下: (1)给定一个数,求一个最小的正整数,使得的约数个数为 (2)求出中约数个数最多的这个数 从上面的性质中可以看出,我们要求最小的,它的

zoj 2526 反素数 附上个人对反素数性质的证明

反素数的定义:对于任何正整数,其约数个数记为,例如,如果某个正整数满足:对任意的正整 数,都有,那么称为反素数. 从反素数的定义中可以看出两个性质: (1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小 (2)同样的道理,如果,那么必有 个人理解性证明: 对(1)假设不是从2开始,那么假设n的最小素因素是k,把k换成2,2的次数仍等于k的次数,得到N,可知,N<n,并且f(n)==f(N),与n是反素数矛盾 对(2)假设ti<tj   ti,tj

ZOJ 2562 More Divisors(高合成数)

ZOJ 2562 More Divisors(高合成数) ACM 题目地址:ZOJ 2562 More Divisors 题意: 求小于n的最大的高合成数,高合成数指一类整数,不论什么比它小的自然数的因子数目均比这个数的因子数目少. 分析: 网上都叫它反素数,事实上我查了一下,翻素数应该是正着写倒着写都是素数的素数.这个应该叫高合成数,见Wikipedia: Highly composite number 高合成数有下面特征: where p1<p2<?<pk are prime, an

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