思维定式了,看到题目就一直想两个数怎么怎么地,还硬生生的搞出了一个规律,但是,看起来就会超时超的不成样子,只好网上搜了一下。。。
原题可转化为a*b*c <=n ,求满足情况的a,b,c的个数。。。这样的话就容易想了,当其中三个相同时是一种情况,两个相同时是一种情况,都不同时又是一种情况,然后各种情况都是简单组合了,然后就可以得出答案了。。。4000+ms过的。。。惭愧啊。。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
LL n , ans, i, j, cas = 1;
while(cin >> n)
{
ans = 0;
for(i = 1; i * i <= n; i ++)
{
if(i * i * i <= n) ans ++;
ans += ((n / i) / i) * 3;
if((n / i) / i >= i) ans -= 3;
}
for(i = 1; i * (i + 1) * (i + 2) <= n; i ++)
{
for(j = i + 1; i * j * (j + 1) <= n; j ++)
{
if(n / i / j > j)
{
ans += (n / i / j - j) * 6;
}
}
}
cout <<"Case " << cas ++ << ": " << ans << endl;
}
}