[POI2002][HAOI2007]反素数

题目描述

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么?

此题以前学习过,此次刷POI又一次碰到了,我们看到要找到不超过N的最大反质数,我们就可以将问题转化。

在一开始的时候我将问题转化错了,我将问题转化为找到不大于N的中约数最多的数中的的最大的那个。我们考虑它为什么它不对。

  令  ∀ x<y<=N 使g(x)=g(y)

    那么 那么我们发现对于y来说,当i=x的时候,不满足g(x)>g(i)的要求,若将题设改为找到不大于N的中约数最多的数中的的最小的那个就会满足要求

由公式n= a[1]^k[1] * a[2]^k[2] *…..a[n]^k[n],约数个数 t=(k[1]+1)(k[2]+1)…..*(k[n]+1)可得出约数个数计算的方法由此我们可以进行搜索。

这里对于我们的搜索有一个小剪枝(不加会TLE,实测有效):

  一个数由许多质数的某次方相乘得到,难么满足题设的数所分解的较大的质数的指数一定小于较小的质数的指数

证明也很简单:如果较大的质数的指数大于较小的质数的指数,那么我们将两个质数的指数交换会使最终乘起来的数字变小,却不会使该数的约数个数变少,至此原剪枝得证

实现如下:

#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long ll;
const ll su[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
inline ll read()
{
    register ll p(1),a(0);register char ch=getchar();
    while((ch<‘0‘&&ch>‘9‘)&&ch!=‘-‘) ch=getchar();
    if(ch==‘-‘) p=-1,ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘) a=a*10+ch-48,ch=getchar();
    return a*p;
}
inline ll min(ll x,ll y){return x>y?y:x;}
ll n,ans=0x3f3f3f3f,maxn=0,ke=0;
void dfs(ll xx,ll pre,ll num,ll jl)
{
    ll ji=0;
    if(num>maxn) ans=xx,maxn=num;
    else if(num==maxn) ans=min(ans,xx);
    if(pre==16) return;
    while(ji<=jl&&xx<=n)
    {
        dfs(xx,pre+1,num*(ji+1),ji);
        xx*=su[pre];++ji;
    }
}
int main()
{
    n=read();
    dfs(1,1,1,30);
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/cold-cold/p/10013655.html

时间: 2024-10-11 16:42:41

[POI2002][HAOI2007]反素数的相关文章

题解 P1463 【[POI2002][HAOI2007]反素数】

题目链接 Solution [POI2002][HAOI2007]反素数 题目大意:设\(x\)的约数个数为\(g(x)\),若对于所有\(i \in [1,x)\),都有\(g(i) < g(x)\),则称\(x\)为反素数,求不超过\(n\)的最大反素数 分析:这道题可以打表,但是打表也要讲求方法 对于\(n = 2 \times 10^9\)这种级别的数据,如果你用\(O(n^2)\)算法,估计你得搬出太湖之光才能以可以接受的速度跑完(而且你还得考虑并行计算效率问题) 我们把这个问题分成两

P1463 [POI2002][HAOI2007]反素数

打表出奇迹!!! 这道题暴力当然能做,但是\(n==2 \times 10 ^9\)就不允许暴力了. 让我们打表出奇迹!!! 首先先了解一下如何有效率地算出一个数的约数个数: 最暴力的是从\(1\)枚举到\(n\),每一次++. 优化一点的就是只枚举到\(\sqrt{n}\).但是还是很慢的. 我们了解一下传说的约数个数定理: 对于一个正整数\(n\),由唯一分解定理可以分解为\(p_1^{a_1} \times p_2^{a_2} \times ... \times p_i^{a_i}\).

[POI2002][HAOI2007]反素数 数论 搜索 好题

Code: #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int prime[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51,53}; ll n, maxn; int cur; void dfs(int dep,ll m,int t,int p){ //上一个指数 if(dep==12){ if(t>=cur){

[POI2002][HAOI2007]反素数(Antiprime)

题目链接 这道题需要用到整数唯一分解定理以及约数个数的计算公式.这里我就不再阐述了. 公式可以看出,只有指数影响约数个数,那么在唯一分解出的乘式中,指数放置的任何位置都是等价的.(即 23*34*57与27*34*53的约数个数相同)但很明显指数放置位置的不同会影响乘积的大小.由于所有比n小的数的约数个数都比他的约数个数小,换而言之就是约数个数不相等.即 相同约数个数,该数越小越好.那么我们运用贪心思想.尽量大的指数放置于尽量小的底数上. 题目的数据范围小于231,所以指数最大31,由之前的推论

【BZOJ 1053】 1053: [HAOI2007]反素数ant (反素数)

1053: [HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么 ? Input 一个数N(1<=N<=2,000,000,000). Output 不超过N的最大的反质数. Sample Input 1000 Sample Output

【BZOJ】1053: [HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Description: g(x)表示x的约数个数,反素数:对于任意的i (i < x),均有g(i) < g(x),则x为反素数:现在输入不超过2e9的数,要你找出不超过N的最大的反素数: 坑点:里面的反素数是严格小于,所以对于相同的约数要取较小的. 思路:直接深搜外加剪枝即可: #include<iostream> #include<cstdio> #include<cstring> #include<

[HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1907  Solved: 1069[Submit][Status][Discuss] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么?

bzoj 1053: [HAOI2007]反素数ant 搜索

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Status] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N

HAOI2007反素数

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1346  Solved: 732[Submit][Status] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个