题目大意:
由于找不到题目,所以直接口述一下好了,定义函数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的答案就是上边那个。