问题描述: swust打不开,随便找了个博客。。。。

对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.

定义:如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

现在给一个N,求出不超过N的最大的反素数.

比如:输入1000 输出 840

思维过程:

求[1..N]中最大的反素数-->求约数最多的数(约数同样多取数值小的)

简单证明:

如果X是答案,但X不是约数最多的数,假设约数最多的数是Y,那么Y>X,否则不符合反质数的定义。

那么很明显Y也是一个反质数,且Y比X大,那么答案应该是Y而不是X。

如果求约数的个数 756=2^2*3^3*7^1

(2+1)*(3+1)*(1+1)=24

基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子

为了剪枝:

性质一:一个反素数的质因子必然是从2开始连续的质数.

因为最多只需要10个素数构造:2,3,5,7,11,13,17,19,23,29

性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

 //// Antiprime数.cpp : 定义控制台应用程序的入口点。
////
//
#include "stdafx.h" #include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
int prime[] = { , , , , , , , , , , };
//相应的限制次数{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
//2*3*5*7*11*13*17*19*21*23>n,所以只需考虑到23即可
ll n, BestSum, BestNum; //num表示当前数字大小、sum表示当前数字的约数个数、limit表示第k个素数的上限,k表示第k个素数
void solve(ll num, ll sum, ll limit, ll k)
{
//cout << "=======================: pos:" << k << "\tdiv:" << sum << "\tnum:" << num << "\tlimit:" << limit << endl;
if (sum>BestSum){
BestSum = sum;
BestNum = num;
}
else if (sum == BestSum&&num<BestNum){//约数个数一样时,取小数
BestNum = num;
}
for (int i = ; i <= limit; i++){//素数k取i个
cout << "=====================================================================" << endl;
cout << "now num:" << num << "\tk:" << k << "\ti:" << i << "\tlimit:" << limit << endl;
cout << num << "*prime[" << k << "]=" << "="<<num <<"*"<<prime[k]<< "=" << num * prime[k] << endl;
cout << "sum:" << sum << "\ti:" << i << "\tsum*(1+" << i << ")=" << sum*( + i) << endl;
cout << "=====================================================================" << endl<<endl;
num *= prime[k];
if (num>n) return;
solve(num, sum*( + i), i, k + );
}
}
int main(){
cin >> n;
solve(, , , );//每个数最多被分解成10质数的乘积
cout << BestNum;
return ;
}

下面是当n=20时,问题解的遍历图形。

ACM-Antiprime数的更多相关文章

  1. [swustoj 373] Antiprime数

    Antiprime数(0373) 问题描述 如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数.譬如:1, 2, 4 ...

  2. COGS 693. [SDOI2005]Antiprime数 唯一分解定理逆用

    693. Antiprime数 ★★   输入文件:antip.in   输出文件:antip.out   简单对比 时间限制:1 s   内存限制:128 MB 如果一个自然数n(n>=1), ...

  3. Antiprime数-数论

    题目描述 Description 如果一个自然数n满足:所有小于它的自然数的约数个数都小于n的约数个数,则称n是一个Antiprime数.譬如:1.2.4.5.12.24都是Antiprime数.   ...

  4. 巴蜀1088 Antiprime数

    Description 如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数.譬如:1, 2, 4, 6, 12, 2 ...

  5. ACM 删数问题 SDUT 2072

    http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2072.html 删数问题 Time Limit ...

  6. ACM——完数

    完数 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:1930            测试通过:413 描述 自然数中,完数寥若晨 ...

  7. 南阳acm奇偶数分离

    这道题的特殊要求是要先先限定了测试数据的组数,所以多加一条循环语句.下面是已通过的代码: #include<stdio.h>   main() {         int n,m,i,j; ...

  8. ACM 阶乘数位数

    描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?   输入 首行输入n,表示有多少组测试数据(n<1 ...

  9. ACM Fibonacci数 计算

    Fibonacci数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递 ...

  10. ACM题目————数素数

    令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN的所有素数 ...

随机推荐

  1. eclipse导入项目上面有个红叉X

    问题: 今天突然想到一个以前做过的项目,想导入到新环境中,发现不管咱整都一个红叉X, 我记得以前好像碰到过类似的问题,当时三秒搞定,谁知道时间一长,三分钟没有搞定. 还是记录下: 一般导入项目出错,肯 ...

  2. mysql如何查看表的索引以及如何删除表的索引

    mysql中如何查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果如下: 查询到唯一索引后,如何删除唯一索引呢,使用如下命令: ...

  3. Jsp补充

    留在这里日后出错可查 <%@ page language="java" import="java.util.*,java.lang.*" pageEnco ...

  4. 143、Java内部类之访问方法中定义的参数或变量

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...

  5. 本地jar在打包时打入到项目中去

    <dependency> <groupId>com.hxyc</groupId> <artifactId>hxyc-common</artifac ...

  6. mybatis关键查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  7. Zabbix在Docker中的应用和监控

    目录 Zabbix在Docker中的应用和监控 一.如何使Zabbix跑在Docker里 1.Docker基础环境配置 2.Docker-compose安装配置 3.启动zabbix server 4 ...

  8. #写一个随机产生138开头手机号的程序 1.输入一个数量,产生xx条手机号 2.产生的这些手机号不能重复

    import randomcount=int(input('请输入你所想要手机号数量:'))prefix='138'for i in range(count): num=random.sample(r ...

  9. PromQL操作符

    PromQL操作符 使用PromQL除了能够方便的按照查询和过滤时间序列以外,PromQL还支持丰富的操作符,用户可以使用这些操作符对进一步的对事件序列进行二次加工.这些操作符包括:数学运算符,逻辑运 ...

  10. Python递归函数如何写?正确的Python递归函数用法!

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.一.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x … x n,用函数fact(n)表示,可以看出:fac ...