HDU 4473 Exam 枚举
2013-09-02 15:12
274 查看
原题转化为求a*b*c <=n中选出两个数组成有序对<a,b>的选法数。
令a<=b<=c....
分情况讨论:
(1)全部相等,即a = b = c.
选法有n^(1/3).
(2)有两个相等,则设相等的值为i,枚举i = 1到i*i <= n ,剩下的一个数的最大值为t = n/(i*i).当t >=i时,t = i这一种要删除,因为t = i则三个数都相等了,这种选法有3种,所以ans += 3*(t-1).t<i就ans += 3*t;
(3)三个数都不相等,则枚举a,b,其中b>a,剩下的数的最大值s = n/(a*b),如果s <= b,不满足····,假设s>b,则ans += 6*(s - b ).
分类讨论时要不重复,不遗漏······
贴代码:
View Code
注意n为long long int ·······
令a<=b<=c....
分情况讨论:
(1)全部相等,即a = b = c.
选法有n^(1/3).
(2)有两个相等,则设相等的值为i,枚举i = 1到i*i <= n ,剩下的一个数的最大值为t = n/(i*i).当t >=i时,t = i这一种要删除,因为t = i则三个数都相等了,这种选法有3种,所以ans += 3*(t-1).t<i就ans += 3*t;
(3)三个数都不相等,则枚举a,b,其中b>a,剩下的数的最大值s = n/(a*b),如果s <= b,不满足····,假设s>b,则ans += 6*(s - b ).
分类讨论时要不重复,不遗漏······
贴代码:
#include<cstdio> typedef long long int LL; int main() { // freopen("in.txt","r",stdin); LL n,ans; int kase = 0; while(~scanf("%I64d",&n)) { ans = 0; for(LL i=1; i*i*i <=n; ++i) ++ans; int A = ans; for(LL i=1; i*i <=n ; ++i) { LL t = n/(i*i); if(t >= i) ans += 3*(t-1); else ans += 3*t; } for(LL a=1; a<=A; ++a) { LL k = n/a; for(LL b=a+1; b*b <= k; ++b) { LL s = n/(a*b); if(s > b) ans += 6*(s-b); } } printf("Case %d: %I64d\n",++kase,ans); } return 0; }
View Code
注意n为long long int ·······
相关文章推荐
- hdu 4473 Exam 构造枚举
- HDU 4473 Exam 构造枚举
- HDU 4473 Exam 有点技巧的暴力枚举 (2012成都区域赛J题)
- hdu 4473 Exam 数学
- HDU 4473 Exam 2012成都现场赛J题(规律+思维)
- hdu 4473 Exam
- [暴力]HDU 4473——Exam
- HDOJ 4473 Exam 暴力枚举
- hdu 4473 Exam (2012ACM成都赛区现场赛J题)
- hdu 4473 Exam
- hdu 4473 Exam
- HDU-4473 Exam 数学分析
- HDU 4473 - Exam 思维..想到了就很简单..
- hdu 4473 Exam
- [暴力] HDU 4473 Exam
- HDU 4473 HDOJ Exam (推理,5级)
- HDU 4473 HDOJ Exam (推理,5级)
- HDU 4473 HDOJ Exam 2012ACM亚洲赛成都赛区J题
- hdu 4473 Exam
- 暴力枚举,dfs(连连看,HDU 4272)