数论考试题(b) 求约数的约数的最大个数

Posted mowanying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论考试题(b) 求约数的约数的最大个数相关的知识,希望对你有一定的参考价值。

题意:求1~n范围里约数的约数的个数加起来最多的是哪个数 及其总数

题解:技术图片

 

/*
对一个数质因数分解 
首先要知道两个公式:约数的个数的公式,和约数的约数的个数的公式(详见题解)
然后发现:质因数分解后 小的次冥尽量大 会使答案更优 然后使次幂单调不升 dfs求r序列 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int pri[]=2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53;
ll ans,maxn=0,n,ans2;
void dfs(int pos,ll sum,ll tot,int last)//dfs每一层乘一个质因子 质因子的数目枚举决定 

    if(sum<=0) return ;//tot相同的同时ans要尽量小 
    if(tot>maxn||(tot==maxn&&sum<ans)) ans=sum,maxn=tot;
    for(int i=1;i<=last&&sum<=n/pri[pos];i++)//不能打sum*pri[pos]<=n!! 因为有可能会爆long long变成负数 
        sum*=pri[pos];
        if(sum>n||sum<0) return ;
        dfs(pos+1,sum,tot*(i+1)*(i+2)/2,i);
    
    

int main()

    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    scanf("%lld",&n);
    dfs(0,1,1,999);
    printf("%lld\\n%lld\\n",ans,maxn);

/*
727793906583744000
*/

 

以上是关于数论考试题(b) 求约数的约数的最大个数的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题七十三之请编写函数求两个数的最大公约数

C语言试题七十三之请编写函数求两个数的最大公约数

Bzoj4176 Lucas的数论

BZOJ4176 Lucas的数论

bzoj4176Lucas的数论 莫比乌斯反演+杜教筛

bzoj4176Lucas的数论 莫比乌斯反演+杜教筛