题意:
「三角数」即用递增的自然数相加得到的数,因此第7个三角数为1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。前10个三角数为:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
先让我们来看看前7个三角数各自都有哪些因数吧:
- 1: 1
- 3: 1,3
- 6: 1,2,3,6
- 10: 1,2,5,10
- 15: 1,3,5,15
- 21: 1,3,7,21
- 28: 1,2,4,7,14,28
可见,28是第一个拥有超过5个因数的三角数。
那么第一个拥有超过500个因数的三角数是……?
设ps[i]代表i的因子的个数。
第n个三角数为n*(n+1)/2;
如果n为偶数,那么它的因子的个数为(ps[n/2]*ps[n+1]),否则为ps[n]*ps[n/2+1];
代码:
#include<stdio.h>
#include<math.h>
#include<iostream>
#define maxn 100001
using namespace std;
int ps[maxn];
void chu()
{
int i,j;
for(i=1;i<maxn;i++)
{
ps[i]=1;
}
for(i=2;i<maxn;i++)
{
for(j=1;j*i<maxn;j++)
{
ps[i*j]++;
}
}
}
int main()
{
int n;
cin>>n;
chu();
for(int i=1;;i++)
{
int mm;
if(i%2==0)mm=(ps[i/2])*ps[i+1];
else mm=ps[i]*(ps[(i+1)/2]);
//cout<<i<<" "<<ps[i]<<" "<<ps[i+1]<<" "<<mm<<endl;
if(mm>n)
{
cout<<i<<" "<<ps[i]<<" "<<ps[i+1]<<" "<<mm<<endl;
cout<<i*(i+1)/2<<endl;
break;
}
}
return 0;
}