反质数问题,求不大于n的最大反质数

反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数
  我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = p1^k1+p2^k2...pn^kn
   
  一个数n如果可以表示成 n = p1^k1 + p2^k2,<span style="color: #ff0000;"> 那么它的约数的个数就是 (k1+1)*(k2+1)</span>
   
  ::k1个p1,可以产生k1个约数,分别是p1^1, p1^2...p1^k1, 同理k2个p2
    那么这k1个约数与k2个约数分别相乘,又会得到k1*k2个约数
    总的约数的个数就是 k1*k2+k1+k2+1(还有就是1,也是n的一个约数,不要忘记)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

typedef long long LL;
int p[]={2,3,5,7,11,13,17,19,23,29};

LL n, ans, cc;

void dfs(int pos, int cnt, LL sum){
    //pos,p数据的索引;cnt,约数的个数;sum,当前反质数的值
    if(cnt > cc){
        ans = sum;
        cc = cnt;
    }
    if(cnt == cc && ans > sum)
         ans = sum;
    if(pos>=10) return;
    for(int i=1; ; ++i){
        sum*=p[pos];
        if(sum > n) break;
        dfs(pos+1, cnt*(i+1), sum);
    }
}

int main(){
    cin>>n;
    ans = 0;
    dfs(0, 1, 1);
    cout<<ans<<endl;
    return 0;
}
时间: 2024-08-30 17:29:44

反质数问题,求不大于n的最大反质数的相关文章

舍远求近 IE6中如何实现反钓鱼功能

在Internet Explorer 7中微软提供了对付"网络钓鱼"的工具,可并非所有用户都已顺利升级到7.0,作为 众多使用IE 6.0的用户来说,能否拥有对付"网络钓鱼"的本领呢?答案是 肯定的--只要给IE6安装一个反钓鱼插件"Phishing Filter"即可. 小提示该插件要求安装的系统必须为Windows XP SP2,且要先给IE 6.0安装MSN Search Toolbar2.05以上版本的工具栏.安装该插件之后 重新启动IE

求某个大于10000的数的约数中,最大的三位数(C ++)

//求某个大于10000的数的约数中,最大的三位数 //求某个大于10000的数的约数中,最大的三位数 #include<iostream> using namespace std; int main() {  int i,integer; cin>>integer; for(i=999;i>=100;i--) { if(0==integer%i) { cout<<i<<endl;//endl相当于换行 break; } } return 0; }

PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠_php实例

通过AJAX传到PHP的json字符串有时候加上反斜杠"\"来转义,PHP处理时需要先去掉反斜杠,然后再json_decode. $str = stripslashes($_POST['json']); $arr = json_decode($str,true); PS:php get抓取json怎样去除双引号前面的反斜杠 你这个不算标准的JSON格式数据,可以先将\"替换成"即可. 再用json_decode()系统函数将其转为json对象,如需转为数组加上第二个

求不大于一个值的最佳组合

问题描述 比如给定一个数组2.3,5,7.1,8,9,900,101,200可能数组元素很多上万个我想按元素组合起来数值不超过790每个元素只能出现一次所有元素都要组合到求c#算法有点类似背包问题但是数量太大了求时间空间复杂度较低的写法 解决方案 解决方案二:这是个线性整数规划问题...解决方案三:C(M,N)N=1,2,3...M再加上个过滤器解决方案四:数组中有小数??会重复??解决方案五:"所有元素都要组合到"是什么意思?一旦你纠结"所有.最"这种词儿,那么就

求正则表达式大于0的数字,整数部分不能超过15位,小数部分不能超过3位

问题描述 各位大神,速来围观,大于0的数字,整数部分不能超过15位,小数部分不能超过3位,再顺便问一下^(\d{1,15})(\.\d{1,3})?$和/^[(\d{1,15})(\.\d{1,3})?]/g分别啥意思啊 解决方案 解决方案二:0.001~999999999999999.999解决方案三:去看看正则文档就可以了...正则表达式也没多难,这东西逻辑思维正常基本半天就能入门的

如何求n阶方阵中各条反斜线上的元素之和4*4

#include<stdio.h> void main() { //其中第一条斜线是00 - 11 - 22 -33 第二条10 - 21 - 32 int arr2[4][4] = { 00, 01, 02, 03, 10 , 11, 12, 13, 20 , 21, 22, 23, 30, 31, 32, 33,}; int i, j; int sum = 0; int index = 0; for (int i = 0; i < 4; i++) { for (int j = 0;

求一个大于1的正则表达式!

问题描述 谢谢! 问题补充:地狱牢笼 写道 解决方案 public static void main(String[] args) throws Exception {Pattern p = Pattern.compile("([2-9]+(\.\d+)?)|(1\d+(\.\d+)?)|(1\.\d*[1-9]+)");String[] a = { "1.0000000000000001", "12.001", "1.0000&quo

shell脚本中的反引号,单引号,双引号与反斜杠

转自:http://blog.sina.com.cn/s/blog_6561ca8c0102we2i.html   反引号位 (`)经常被忽略,而且容易与单引号弄混.它位于键盘的Tab键的上方.1键的左方.单引号(')位于Enter键的左方.在Linux中反引号起着命令替换的作用.命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到,将系统命令的执行结果赋给一个变量.如下,shell会执行反引号中的date命

反垄断第一案百度胜诉 专利保护和反垄断需平衡

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 昨天(18日)上午,<反垄断法>实施后的第一起反垄断案在北京一中院宣判,经过审理,法院认为原告人人信息服务有限公司没有证据能够证明百度公司具有市场支配地位,其减少对"全民医药网"的收录行为正当.法院首次在判决书中认定,搜索引擎市场是由反垄断法调整的市场. 中国之声主持人:我们注意到,原告律师事后说:"