ZOJ 2562 More Divisors(高合成数)

ACM

题目地址:ZOJ 2562 More Divisors

题意: 

求小于n的最大的高合成数,高合成数指一类整数,不论什么比它小的自然数的因子数目均比这个数的因子数目少。

分析: 

网上都叫它反素数,事实上我查了一下,翻素数应该是正着写倒着写都是素数的素数。这个应该叫高合成数,见Wikipedia: Highly composite number

高合成数有下面特征: 

where p1<p2<⋯<pk are
prime, and the exponents ci are
positive integers. 

Any factor of n must have the same or lesser multiplicity in each prime: 

p1^d1×p2^d2×⋯×pk^dk, 0≤di≤ci, 0<i≤k 

所以用回溯枚举。

代码:

/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: 2562.cpp
* Create Date: 2014-08-06 20:45:53
* Descripton: Highly Composite Number
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define repf(i,a,b) for(int i=(a);i<=(b);i++) typedef long long ll; const int M = 1000; ll n;
ll bestNum;
ll bestSum;
ll hcm[M][2];
ll prim[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67}; // current is num, use the prim[k], sum of divisors, the limit of prim[k] you can use
void getNum(ll num, int k, ll sum, int limit) {
if (sum > bestSum) {
bestSum = sum;
bestNum = num;
} else if (sum == bestSum && num < bestNum) {
bestNum = num;
} ll p = prim[k];
for (int i = 1; i <= limit; i++, p *= prim[k]) { // use i prim[k]s
if (num * p > n) break;
getNum(num *= prim[k], k + 1, sum * (i + 1), i);
}
} // clac log2(n)
int log2(ll n) {
int ret = 0;
ll p = 1;
while (p < n) {
p <<= 1;
ret++;
}
return ret;
} // return the number of Highly Composite Number in [1, n]
// and save the HCM in hcm[][2]
int gethcm() {
int ret = 0;
n = 500000; // [1, n]
while (n > 0) {
bestNum = 1;
bestSum = 1;
getNum(1, 0, 1, log2(n));
cout << bestNum << ' ' << bestSum << endl; hcm[ret][0] = bestNum;
hcm[ret][1] = bestSum;
n = bestNum - 1;
ret++;
}
return ret;
} int main() {
while (cin >> n) {
bestNum = 1;
bestSum = 1;
getNum(1, 0, 1, 50);
cout << bestNum << endl;
}
}

ZOJ 2562 More Divisors(高合成数)的更多相关文章

  1. ZOJ 2562 More Divisors

    又是个水题,刚刚开始没有用搜索,因为对于反素数有: n=2^t1*3^t2^5^t3*7^t4..... 这里有 t1>=t2>=t3>=t4. 而且相同的因数的情况下,素数越不同越 ...

  2. ZOJ 2562 HDU 4228 反素数

    反素数: 对于不论什么正整数x,起约数的个数记做g(x).比如g(1)=1,g(6)=4. 假设某个正整数x满足:对于随意i(0<i<x),都有g(i)<g(x),则称x为反素数. ...

  3. zoj 2562 反素数

    题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x)) x用质因数形式为:x=a1^p1*a2^p2......an^pn(a ...

  4. ACM数学

     1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...

  5. [BZOJ]3737 [Pa2013]Euler

    从这个FB开始写博客啦. 也不知道会坚持多久…… = =似乎要加一句转载请注明出处 http://www.cnblogs.com/DancingOnTheTree/p/4026076.html htt ...

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

    Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , ...

  7. ZOJ- 2562 反素数使用

    借用了下东北师大ACM的反素数模版. 本来我是在刷线段树的,有一题碰到了反素数,所以学了一下..有反素数的存在,使得一个x ,使得x的约数个数,在1 到 x的所有数里面,是最大的. 这里面还涉及安叔那 ...

  8. zoj 3762(求三角形的最大高)

    给出n个点,要你找到一个三角形,它的高是最长的. 思路:暴力超时了,是用先找出n个点与其他点的最长边,再枚举顶点过的.......具体证明不知道..... #include<algorithm& ...

  9. zoj 2286 Sum of Divisors

    // f(n)表示 n的约数和 不包括自己// 给你一个m 求1 到 100万里面 f(n)<=m 的个数// 那么首先要用筛选求出所有出 f(n)// 然后就好办了 // 写好后 看见别人好快 ...

随机推荐

  1. the C programming language 阅读笔记2

    1. 指针 1.1 自增符的使用 ++*p;//p指向的内容加一 (*p)++; //p指向的内容加一 *p++;//p本身自增 *++p; //p本身自增 因为诸如*和++这样的一元运算符在表达式求 ...

  2. VMware ESXI4.1 常用命令

    一. VMware ESX Command 1. # vmware –v  (查看esx版本) 2. # esxcfg-info -a(查看显示ESX硬件,内核,存储,网络等信息) # esxcfg- ...

  3. CDC不同模式在ODI中体现系列之一 同步模式

    CDC不同模式在ODI中体现系列之一 同步模式 Oracle Database Change Data Capture feature 变化数据捕获是一个通称,是用来描述捕捉增量变化应用到数据存储.随 ...

  4. TFS Build Definition

    1.  TFS Build 简介 在团队项目开发中,编译常常是一个很困难的事情! 可能你会反问编译有什么难的?不就是右键,然后点击 Build/Rebuild, 或者直接按 F5 么?这都不会,真不知 ...

  5. rsyslog start with

    startswith Checks if the value is found exactly at the beginning of the property value. For example, ...

  6. ceph伦理概念

    Preface: CEPH: THE FUTURE OF STORAGE(未来存储) Ceph was made possible by a global community of passionat ...

  7. thunk的主要用法

    主要用法目前用的多的就三种; thunk.all 并发 thunk.sql 同步 thunk.race 最先返回的进入结果输出 前两个返回的结果都是数组,最后一个返回的是对象: thunk的链式调用没 ...

  8. 继承过程中对函数中this的认识

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Android文件存储使用参考

    可能遇到的问题 android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的硬盘,后者好移动硬盘. 前者空间较小,后者空间大,但后者不一定可用. 开发应用,处理本地数据存取时 ...

  10. java写文件时,输出不完整的原因以及解决方法

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...