现在的位置: 首页 > 综合 > 正文

hdu 4473 数学

2013年10月24日 ⁄ 综合 ⁄ 共 611字 ⁄ 字号 评论关闭

题目链接: 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);
	}
}

抱歉!评论已关闭.