zoukankan      html  css  js  c++  java
  • Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】

    题目链接:https://www.luogu.org/problemnew/show/P1463

    题意:

      对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

      如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

      现在给定一个数N,你能求出不超过N的最大的反质数么?

    题解:

      对于一个反素数p有两个结论:

        若将p表示为 ∏(a[i]^k[i])的形式,其中a[i]为质因子,k[i]为指数。

        (1)a[i]为从2开始的连续质数:2,3,5,7...

        (2)k[i]为不升序列:k[1]>=k[2]>=...k[x]

      证明:

        结论1:

          因为一个数x的因子个数 = ∏(k[i]+1)

          所以当两个数的k[i]序列完全相同时,a[i]为从2开始的连续质数的那个数字更小。

          所以另一个数一定不是反素数。

        结论2:

          若两个数的k[i]序列的元素相同(如{1,1,2}和{1,2,1}相同)

          由结论1可知,两个数的a[i]序列完全相同(都是从2开始的连续质数)

          所以k[i]为不升序列的那个数一定更小。

          所以另一个数一定不是反素数。

     

      那么就可以爆搜了。

      在保证a[i]为从2开始连续质数,且k[i]不升的前提下,枚举n以内所有可能是反素数的数。

      在枚举出的所有数中,答案为因子个数最多的那个数。

      若有因子相同的多个数,则选最小的那个数。

    AC Code:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #define INF 1000000000
     5 
     6 using namespace std;
     7 
     8 const int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59};
     9 
    10 long long n;
    11 long long ans=0;
    12 long long now=0;
    13 
    14 void dfs(int x,int lst,long long tot,long long v)
    15 {
    16     if(tot>now || (tot==now && v<ans)) ans=v,now=tot;
    17     int cnt=0;
    18     while(v*p[x]<=n && cnt<lst)
    19     {
    20         v*=p[x]; cnt++;
    21         dfs(x+1,cnt,tot*(cnt+1),v);
    22     }
    23 }
    24 
    25 int main()
    26 {
    27     cin>>n;
    28     dfs(0,INF,1,1);
    29     cout<<ans<<endl;
    30 }
  • 相关阅读:
    PIE SDK SFIM融合
    PIE SDK PCA融合
    c# 粘贴复制
    dev gridview 单元格值拖拽替换
    sql 行数据找出最大的及所有数据最大的
    mvc 登陆界面+后台代码
    mvc控制器返回操作结果封装
    Java 未来行情到底如何,来看看各界人士是怎么说的
    Java工程师修炼之路(校招总结)
    ​为什么我会选择走 Java 这条路?
  • 原文地址:https://www.cnblogs.com/Leohh/p/8391565.html
Copyright © 2011-2022 走看看