zoj2562:搜索+数论(反素数)

题目大意:求n以内因子数量最多的数  n的范围为1e16

其实相当于求n以内最大的反素数。。。

由素数中的 算数基本原理

设d(a)为a的正因子的个数,则

d(n)=(a1+1)(a2+1).....*(an+1);

又由反素数的性质2:

p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

我们可以指定搜索策略和剪枝

详见代码和注释

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
long long n;
long long a[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};//这些素数全部乘积已经超过了1e16,所以不用再往下面乘了
long long ans,ans0;
void dfs(long long num,long long sum,long long limit,long long po)//limit 存储上一个素数的指数 相当于反素数性质中的t(i-1),由性质可知ti<=t(i-1)
{
    if(num>n)
        return;
    if(sum==ans0)
    {
        ans=min(ans,num);
    }
    if(sum>ans0)
    {
        ans0=sum;
        ans=num;
    }
    long long p=1;
    for(int i=1;i<=limit;i++)
    {
        p*=a[po];
        if(p*num>n)
            break;
        dfs(num*p,sum*(i+1),i,po+1);
    }
    return;
}
int main()
{
    while(scanf("%lld",&n)!=EOF)
    {
        ans0=0;
        ans=0;
        if(n==1)
        {
            puts("1");
            continue;
        }
        dfs(1,1,100,0);
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-07 00:18:41

zoj2562:搜索+数论(反素数)的相关文章

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

BZOJ1053 [HAOI2007]反素数ant 数论

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? (1<=N<=2,000,000,000) 题解 对于任何一个反素数p,总有: p=2q1×3q2×5q3×7q4... 而且q

BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: int prime[]= { 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,103,107,109, 113,127,131,137,139, 14

51nod 1060 最复杂的数(数论,反素数)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1060 题解:可以去学习一下反素数. #include <iostream> #include <cstring> #define inf 1000000000000000007 using namespace std; typedef unsigned long long ull; const int M = 1e6 + 10; ull n ,

数论——素数和反素数

素数 素数一般判定方法 bool isPrime(a) { if (a < 2) return 0; for (int i = 2; i * i <= a; ++i) if (a % i) return 0; return 1; } 但对于long long int的数,O(√n)的复杂度还是会时间超限. 此时要用Miller-Rabin 素性测试,但也只是极为可能是素数. 复杂度O(klog3n). #include <iostream> using namespace std

HDU 2521 反素数

反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4238    Accepted Submission(s): 2456 Problem Description 反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使

洛谷 P1463 [SDOI2005]反素数ant

P1463 [SDOI2005]反素数ant 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 输入输出格式 输入格式: 一个数N(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入输出样例 输入样例#1: 1000 输出样例#1: 840思

luoguP1463 [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的最大的反质数么? 输入输出格式 输入格式: 一个数N(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入输出样例 输入样例#1: 复制 1000 输出样例#1: 复制840 思路:一看这道题,不用说这是个数论,

反素数深度分析

装载自:http://blog.csdn.net/ACdreamers/article/details/25049767 小知识点: 如果求约数的个数 756=2^2*3^3*7^1 (2+1)*(3+1)*(1+1)=24 基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子 为了剪枝: 性质一:一个反素数的质因子必然是从2开始连续的质数. 因为最多只需要10个素数构造:2,3,5,7,11,13,17,19,23,29 性质二:p=2^t1*3^t2*5^t3*7