第十届蓝桥杯决赛 约数个数 填空倒数第二题

题目大意:

        由于找不到题目,所以直接口述一下好了,定义函数S(i)为含有i个因子的最小正整数。

         S(1)=1,S(2)=2,S(3)=4,S(4)=6.。。。。。

         让求出S(1)+S(2)+.......+S(60)=  ?

         首先打表暴力

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll MAXN=1e8+5;
int num[100000005];
int ans[100];
int main()
{
    for(int i=1;i<=MAXN;i++){
        for(int j=1;j*i<MAXN;j++){
            num[i*j]++;
        }
    }
    for(int i=1;i<=MAXN;i++){
        if(num[i]<=60&&!ans[num[i]]){
            ans[num[i]]=i;
        }
    }
    for(int i=1;i<=60;i++){
        cout<<i<<" "<<ans[i]<<endl;
    }
}

(跑了好久)然后我们发现有几个是出不来的,分别是31  37  41  43  47  53  58  59

我们发现大部分是质数,一个数字质因数分解之后就是p1^q1  *  p2^q2  *.........

那么约束个数就是(q1+1)*(q2+1)*(q3+1)*...............

比如我们看31,他是个质数,所以某个数含有31个因子,那么由上式子得出只能是(30+1)所以最小的就是2的30次幂

但是问题来了 这个58怎么办,就差他自己了。

58可以拆成1*58   2*29 

那么这个后者的话肯定最小的是2^28  *  3^1

那么前者一定是2的57次方  如果再考虑拆58的话就又回到2*29了,所以58的答案就是上边那个。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值