题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4473
题目大意:
求a*b*c <= m; 的组合数有多少个,1<=m<=n;
算法分析: 这个还是看别人的思路做的。。。飘渺的思绪就跟闹着玩似的。
程序代码:
#include<cstdio> #include<cmath> typedef __int64 ll; inline ll pow2(ll n) { ll m = pow(n, 0.5); while(m*m <= n) m++; while(m*m > n) m--; return m; } inline ll pow3(ll n) { ll m = pow(n, 1.0/3.0); while(m*m*m <= n) m++; while(m*m*m > n) m--; return m; } int main() { ll n,cas = 1; while(~scanf("%I64d",&n)) { ll ans = pow3(n),m = ans; //当a == b == c时,方案总数; for(ll i = 1; i <= m; i++) { ll ni = n/i, k = pow2(ni); ans += (ni/i+k-2*i)*3; // 当 a == b /= c 时,方案总数为ni/i - i,当 a == b /= c 时,方案总数为k - i; for(ll j = i+1; j <= k; j++) ans += 6*(ni/j - j); // 当a /= b /= c 时, 方案数总数; } printf("Case %I64d: %I64d\n",cas++,ans); } }