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,
    149,151,157,163,167,
    173,179,181,191,193,
    197,199,211,223,227,
    229,233,239,241,251
};
int K[]=
{
    1,2,2,3,3,
    4,4,5,5,5,
    5,5,6,6,6,
    6,6,6,6,7,
    7,7,7,7,7,
    7,7,7,7,7,
    7,7,8,8,8,
    8,8,8,8,8,
    8,8,8,8,8,
    8,8,8,8,8,
    8,8,8,8,8
};
struct BIGINT
{
    int a[27];

    BIGINT(){}
    BIGINT(char *s)
    {
        clr(a,0);
        int i,L=strlen(s),cur=0;
        for(i=L-1;i-3>=0;i-=4)
        {
            a[cur]=(s[i-3]-‘0‘)*1000+
                   (s[i-2]-‘0‘)*100+
                   (s[i-1]-‘0‘)*10+
                   (s[i]-‘0‘);
            cur++;
        }
        if(i<0) return;
        if(i==0) a[cur]=s[0]-‘0‘;
        else if(i==1) a[cur]=10*(s[0]-‘0‘)+(s[1]-‘0‘);
        else if(i==2) a[cur]=100*(s[0]-‘0‘)+10*(s[1]-‘0‘)+(s[2]-‘0‘);
    }
    BIGINT(int x)
    {
        clr(a,0);
        a[0]=x;
    }

    inline BIGINT operator*(int x)
    {
        int i;
        BIGINT tmp;
        for(i=0;i<27;i++) tmp.a[i]=a[i]*x;
        for(i=0;i<26;i++)
        {
            tmp.a[i+1]+=tmp.a[i]/10000;
            tmp.a[i]%=10000;
        }
        return tmp;
    }

    int operator<(BIGINT p)
    {
        int i;
        for(i=26;i>=0;i--)
        {
            if(a[i]<p.a[i]) return 1;
            if(a[i]>p.a[i]) return 0;
        }
        return 0;
    }

    int operator==(BIGINT p)
    {
        int i;
        for(i=26;i>=0;i--)
        {
            if(a[i]!=p.a[i]) return 0;
        }
        return 1;
    }
    int operator<=(BIGINT p)
    {
        return *this==p||*this<p;
    }

    void print()
    {
        int cur=26;
        while(cur>0&&0==a[cur]) cur--;
        printf("%d",a[cur]);
        cur--;
        while(cur>=0) printf("%04d",a[cur--]);
        puts("");
    }
};

char s[111];
BIGINT n;
int Max;

int cnt2;

BIGINT ans;
i64 ansFac;

void DFS(int dep,BIGINT cur,i64 facNum,int preMax)
{
    if(facNum>ansFac||facNum==ansFac&&cur<ans)
    {
        ans=cur;
        ansFac=facNum;
    }
    int i;
    i64 tmp=facNum;
    int Min=min(preMax,2*K[Max]-1-1);
    if(dep>1) Min=min(Min,cnt2/(K[dep]-1));
    for(i=1;i<=Min;i++)
    {
        if(dep==1) cnt2=i;
        cur=cur*prime[dep];
        tmp+=facNum;
        if(n<cur) break;
        DFS(dep+1,cur,tmp,i);
    }
}

int main()
{

    scanf("%s",s);
    n=BIGINT(s);

    if(n==BIGINT(1))
    {
        puts("1");
        return 0;
    }
    BIGINT cur=BIGINT(1);
    while(cur<=n) cur=cur*prime[++Max];
    DFS(1,BIGINT(1),1,100);
    ans.print();
}
时间: 2024-10-11 12:28:56

BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)的相关文章

BZOJ1053 [HAOI2007]反素数 &amp; BZOJ3085 反质数加强版SAPGAP

BZOJ 1053 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 题解 可以发现,

CNUOJ 0486 800401反质数

难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g(6)=4. 如果对于任意正整数y,当 0 < y < x 时,x 都满足 g(x) > g(y), 则称 x 为反质数.整数 1,2,4,6 等都是反质数. 现在任意给定两个正整数 M, N,其中,M < N <= 20000000,按从小到大输出其中(包括 M 和 N)的所有

反质数问题,求不大于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, 那么它的约数的个数就是 (k1+1)*(k2+1) ::k1个p1,可以产生k1个约数,分别是p1^1, p1^2...p1^k1, 同理k2个p2 那么这k1个约数与k2个约数分别相乘,又会得到k1*k2个

HYSBZ 1053 反质数

input n 1<=n<=2000000000 output 不大于n的最大反质数 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 做法:直接打表查找 1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <i

反质数

问题描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 分析 这道试题的数学性质很强,关键点在于“一个数与其约数”的关系.在设计算法之前,我们不妨先对“一个数与其约数”进行一番简单的分析. 先举个简单的例子,求一个数756的约数总个数. 大家都知道先将756分解质因子,得到756=22×33×7

COJ 0486 800401反质数

800401反质数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g(6)=4. 如果对于任意正整数y,当 0 < y < x 时,x 都满足 g(x) > g(y), 则称 x 为反质数.整数 1,2,4,6 等都是反质数. 现在任意给定两个正整数 M, N,其中,M < N <= 20000000,按从小到大输出其中(包括

【模板】【数学】反质数

题目链接:https://www.luogu.com.cn/problem/P1463 其实反质数就是要约数最大,在此前提下这个数最小. 然后它分解出来的质数一定是连续的,并且分解出来的质数的指数是单调递减的,所以可以dfs求. 参考:https://blog.csdn.net/qq_40942372/article/details/82016727 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll;

iOS开发——装逼技术精选&amp;关于反编译和防止反编译

关于反编译和防止反编译 反编译 内购破解 iOS应用需防反编译风险之一:插件法(仅越狱).iTools工具替换文件法(常见为存档破解).八门神器修改 网络安全风险 iOS应用需防反编译风险之二:截获网络请求,破解通信协议并模拟客户端登录,伪造用户行为,对用户数据造成危害 应用程序函数PATCH破解 iOS应用需防反编译风险之三:利用FLEX 补丁软件通过派遣返回值来对应用进行patch破解 源代码安全风险 iOS应用需防反编译风险之四:通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心

【转】Android开发之反编译与防止反编译

Android开发之反编译与防止反编译 防止反编译是每个程序员的必修课,因为当你辛辛苦的研发一个应用,被人家三下五除二给反编译了,是一件多么尴尬的事啊.那么如何防止反编译啊?这里就用Google Android自带的代码混编的方式来防止反编译.孙子兵法中讲得好:“知彼知己百战不殆”,所以在讲解防止反编译之前,先让我们了解一下如何反编译一个应用. 一.反编译Android应用 实验环境: Windows8.1企业版.dex2jar-0.0.9.9 反编译工具包: Android反编译工具包(升级版