反素数

反素数的定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0小于i小于x),都有g(i)小于g(x),则称x为反素数·

分解质因数,设一个数可以由p1^x1*p2^x2*p3^x3…组成
其中pi为质数,xi为该质数在一个数中出现的次数
满足反素数有以下条件:
1.因子必须是连续的质因子
2.质因子的次数必须满足后一个比前一个的大
然后因数个数就是(x1+1)(x2+1)(x3+1)…
那么对于1~n,我们就要找因数个数尽量多的
搜索枚举质因数个数,然后记录答案输出即可

#include
#include
#include
#include
#define LL long long
using namespace std;
LL n,ans,s[1100],last;
int tot,prime[105];
bool vis[105];

void dfs(int x,int num,LL mul)
{
    if(x>12) return;
    if(num>last || (num==last && mullast=num;
    }
    s[x]=0;
    while(mul*prime[x]<=n && s[x]<s[x-1])
    {
        mul*=prime[x];
        s[x]++;
        dfs(x+1,num*(s[x]+1),mul);
    }
}

int main()
{
    scanf("%lld",&n);
    for(int i=2;i<=50;i++)
    {
        if(!vis[i]) prime[++tot]=i;
        for(int j=1;j<=tot && i*prime[j]<=50;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
    s[0]=0x3f3f3f3f;
    dfs(1,1,1);
    printf("%lld",ans);
    return 0;
}

你可能感兴趣的:(——数论,数学——)