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

693. Antiprime数

★★   输入文件:antip.in   输出文件:antip.out   简单对比
时间限制:1 s   内存限制:128 MB

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

任务:

编一个程序:

1、
从ANT.IN中读入自然数n。

2、
计算不大于n的最大Antiprime数。

3、将结果输出到ANT.OUT中。

 

输入(
antip.in):

输入文件antip.in只有一个整数,n(1
<= n <= 2 000 000 000)。

 

输出(antip.out):

输出文件antip.out也只包含一个整数,即不大于n的最大Antiprime数。

 

样例输入(
antip.in):

1000

 

样例输出(antip.out):

840

 

问题描述:(转载自vb4896)

对于任何正整数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>=....

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
int prime[12]={0,2,3,5,7,11,13,17,19,21,23};
//2*3*5*7*11*13*17*19*21*23>n,所以只需考虑到23即可
ll n,BestSum,BestNum;
//当前走到num这个数,接着用第k个素数,num的约数个数为sum,
//第k个素数的个数上限为limit
void solve(ll num,ll sum,ll limit,ll k){
    if(sum>BestSum){
        BestSum=sum;
        BestNum=num;
    }
    else if(sum==BestSum&&num<BestNum){//约数个数一样时,取小数
        BestNum=num;
    }
    for(int i=1;i<=limit;i++){//素数k取i个
        num*=prime[k];
        if(num>n) return ;
        solve(num,sum*(1+i),i,k+1);
    }
}
int main(){
    freopen("antip.in","r",stdin);
    freopen("antip.out","w",stdout);
    cin>>n;
    solve(1,1,10,1);
    cout<<BestNum;
    return 0;
}
时间: 2024-12-23 09:11:16

COGS 693. [SDOI2005]Antiprime数 唯一分解定理逆用的相关文章

有趣的数列 唯一分解定理+卡特兰数

问题: 我们称一个长度为\(2n\)的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从\(1\)到\(2n\)共\(2n\)个整数的一个排列{\(Ai\)}: (2)所有的奇数项满足\(A1<A3<-<A2n-1\),所有的偶数项满足\(A2<A4<-<A2n\): (3)任意相邻的两项\(A2i-1\)与\(A2i(1≤i≤n)\)满足奇数项小于偶数项,即:\(A2i-1<A2i\). 现在的任务是:对于给定的\(n\),请求出有多少个不同的长度为\

巴蜀1088 Antiprime数

Description 如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数.譬如:1, 2, 4, 6, 12, 24. 任务:编一个程序: 1.从ANT.IN中读入自然数n. 2.计算不大于n的最大Antiprime数. 3.将结果输出到ANT.OUT中. Input 输入只有一个整数,n(1 <= n <= 2 000 000 000). Output 输出只包含一个整数,即不大于n的最大Antiprime

NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数.现 在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整 数 x 满足: 1. x 和 a0 的最大公约

Coderforce-574C Bear and Poker(素数唯一分解定理)

题目大意:给出n个数,问能不能通过让所有的数都乘以2的任意幂或乘以3的任意幂,使这n个数全都相等. 题目分析:最终n个数都是相等的,假设那个数为x,根据素数唯一分解定理,x能分解成m*2p3q.所以,只需将所有的a[i]一直除以2并且一直除以3,最终只需判断这n个数是否全部相等即可. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include

lightoj 1236 正整数唯一分解定理

A - (例题)整数分解 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Find the result of the following code: long long pairsFormLCM( int n ) {    long long res = 0;   

hdu1215 正整数唯一分解定理应用

B - (例题)因子和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才

整数的唯一分解定理【模板】

给一个正整数n,将n分解为质因数. 说明:n的质因数要么是n本身(n是素数),要么一定小于等于sqrt(n).因此可以用小于等于sqrt(n)的数对n进行试除,一直除到不能除为止. 这时候剩下的数如果不是1,那就是n最大的质因数. 举例说明:100=2^2 * 5^2 ; 模板代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <ctype.h> 5

唯一分解定理证明(WD)

from http://www.matrix67.com/blog/archives/495 为什么质因数分解的方法是唯一的.这个结论是如此的显然和易于接受,以致于有人会脱口而出:这当然是唯一的,不断使用越来越大的质数去试除,最后得到的肯定是唯一的质因数分解.不可否认,这个算法本身是没有任何问题的.根据合数的定义,试除与分解是一定能不断进行下去的,除非被除数本身变成了一个质数,而此时也标志着算法的结束.问题的关键就在于,这并不能说明原数能唯一地表示成质数的乘积:换一种试除的顺序会不会得出不同的分

UVA 10375 Choose and divide(唯一分解定理)

这么大数的乘法.除法运算,肯定不能先全部乘起来,我的思路是计算出分子.分母上的每个数的个数(因为最大的数为10000,可以开一个数组记录个数). 利用了随机数方法终于知道错在哪了,中间如果出现连乘还是会溢出,这点没想到,以下是我的溢出代码: #include<stdio.h> #include<math.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<