问题描述: 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. Python基础-1 基础语法

    基础语法 标识符 所谓的标识符就是对变量.常量.函数.类等对象起的名字. 首先必须说明的是,Python语言在任何场景都严格区分大小写!也就是说A和a代表的意义完全不同 python对于表示标识符的命 ...

  2. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  3. Java 常用转换

    日期转换 SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = ft.par ...

  4. windows通过zip安装mysql5.7.26的一个坑

    需要将my.ini的 红框的/不能写成\ 注意编码格式问题 然后 mysqld --initialize-insecure mysqld --install net start mysql

  5. java 实现图片上传功能

    1:jsp 页面上传图片按钮在这里我就写相关的代码 <div class="control-group"> <label class="control- ...

  6. html-webpack-plugin & clean-webpack-plugin

    html-webpack-plugin Introduction: The HtmlWebpackPlugin simplifies creation of HTML files to serve y ...

  7. Centos7 nginx 反向代理的配置

    一.正向代理与反向代理 1.正向代理 正向代理往VPN理解 正向代理,也就是传说中的代理,他的工作原理就像一个跳板(VPN),简单的说: 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这 ...

  8. Python 基础之常用内置函数

    1.常用内置函数 (1)abs 绝对值函数 intvar = -9 res = abs(intvar)print(res) (2)round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数 ,则 ...

  9. 大数据萌新的Python学习之路(一)

    笔记开始简介 从2018年9月份正式进入大学的时代,大数据和人工智能的崛起让我选择了计算机专业学习数据科学与大数据技术专业,接触的第一门语言就是C语言,后来因为同学推荐的原因进入了学校的人工智能研究协 ...

  10. gets和scanf区别

    scanf 和 gets 读取字符串 深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点 ...