zoukankan      html  css  js  c++  java
  • HAOI2007反素数

    1053: [HAOI2007]反素数ant

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 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

    一个数N(1<=N<=2,000,000,000)。

    Output

    不超过N的最大的反质数。

    Sample Input

    1000

    Sample Output

    840

    HINT

    题解:

    先筛质数,首先我们知道分解质因数后 i=p1^s1*p2^s2...pk^sk;那么g(i)=(s1+1)*(s2+1)*(s3+1)...(sk+1)

    所以我们枚举质数的指数,直接枚举不太好

    我们可以发现一个性质,反质数的各个指数一定是不上升的,因为上升的情况我们可以翻转上升的那一段,使得g不变i变小,这个时候搜索就无压力了

    一开始没注意,其实前十个质数相乘已经很大了,我们只要前十个就行了

    还有就是,要记录现在ans的g,如果有一样的g,要选小的那个

    代码:

     1 const p:array[1..10] of longint=(2,3,5,7,11,13,17,19,23,29);
     2 var n,ans,num:int64;
     3 procedure dfs(x,y,z,k:int64);
     4  var i:longint;
     5  begin
     6  if (num<k) or ((num=k) and (x<ans)) then
     7   begin
     8    ans:=x;num:=k;
     9   end;
    10  for i:=1 to y do
    11   begin
    12    x:=x*p[z];
    13    if x>n then exit;
    14    dfs(x,i,z+1,k*(i+1));
    15   end;
    16   end;
    17 procedure main;
    18  begin
    19  readln(n);
    20  dfs(1,n,1,1);
    21  writeln(ans);
    22  end;
    23 begin
    24  main;
    25 end.          
    View Code
  • 相关阅读:
    进度条
    打开文件的功能代码 JFileChooser
    我对JAVA的初认知
    集合之五:Set接口
    集合之四:List接口
    集合之三:泛型
    Maven web项目(简单的表单提交) 搭建(eclipse)
    集合之二:迭代器
    集合之一:集合概述
    java的函数
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3807839.html
Copyright © 2011-2022 走看看