题目链接: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:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define INF 1000000000 using namespace std; const int p[]={,,,,,,,,,,,,,,,,}; long long n;
long long ans=;
long long now=; void dfs(int x,int lst,long long tot,long long v)
{
if(tot>now || (tot==now && v<ans)) ans=v,now=tot;
int cnt=;
while(v*p[x]<=n && cnt<lst)
{
v*=p[x]; cnt++;
dfs(x+,cnt,tot*(cnt+),v);
}
} int main()
{
cin>>n;
dfs(,INF,,);
cout<<ans<<endl;
}

最新文章

  1. [转]OAuth 2.0 - Authorization Code授权方式详解
  2. Android_server提示端口被占用
  3. ABP之Javascript生成
  4. LAMP简易安装
  5. 与你相遇好幸运,My Toolkit of Nodejs
  6. ASP.NET 学习笔记
  7. 20141212--C#对象比较
  8. 约瑟夫环(N个人围桌,C语言,数据结构)
  9. web开发小节.txt
  10. JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET
  11. mong 备份和恢复
  12. 4.jsp的内置对象
  13. Linux Centos7.x下安装部署VNC的实操详述
  14. python之路——26
  15. 获取object的值
  16. ios 本地存储文件夹的使用注意
  17. Ex 6_9 某个字符串处理语言提供了一个将字符串一分为二的基本操作..._第六次作业
  18. Notes中几个处理多值域的通用函数
  19. jssip中文开发文档(完整版)
  20. Delphi XE7实现的任意位置弹出菜单

热门文章

  1. Unity3D性能优化之Draw Call Batching
  2. Android使用LinearViewLayout展示数据
  3. Java集合系列之TreeMap源代码分析
  4. maven安装jar包到本地仓库
  5. 简单的积雪shader
  6. 微信小程序之云开发一
  7. solr查询
  8. 仿照ArrayList自己生成的MyList对象
  9. 关于angularjs的model的一些问题
  10. poj1061(extendgcd)