HDU4473Exam(数学题)
Posted chenxiaoran666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU4473Exam(数学题)相关的知识,希望对你有一定的参考价值。
大致题意: 设(f(x)=sum[(a*b)|x]),求(sum_{x=1}^nf(x))。
转化题意
将题意进行转换,我们就可以发现,我们要求的(ans)就是满足(x*y*zle n)的解的个数(这应该还是比较显然的)。
大致思路
此题无非就是一个分类讨论。
假设(ale ble c)。
- 当三个数全部相等时,求出的解只有一种排列方式。
- 当三个数中有两个数相等时,求出的解有三种排列方式。
- 当三个数互不相等时,求出的解共有六种排列方式。
按照这种思路,就能很快速地求出答案了。
注意排除重复的情况。
代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n;
class Class_MathSolver
{
public:
inline void Solve(LL x)
{
register LL i,j,k,ans=0;
for(i=1;i*i*i<=x;++i) ++ans;//对于三数相等的情况,虽然这样慢,但能避免精度误差
for(i=1;i*i<=x;++i) if((j=x/(i*i))>=i) ans+=3*(j-1);else ans+=3*j;//对于两数相等的情况,注意不能把三数相等的情况包括在内
for(i=1;i*i*i<=x;++i) for(j=i+1;j<=x;++j) if((k=x/(i*j))>=j) ans+=6*(k-j);else break;//对于三数互不相等的情况,同样注意排除重复的情况
printf("%lld
",ans);
}
}MathSolver;
int main()
{
register int T=0;
while(~scanf("%lld",&n)) printf("Case %d: ",++T),MathSolver.Solve(n);
return 0;
}
以上是关于HDU4473Exam(数学题)的主要内容,如果未能解决你的问题,请参考以下文章
2021HDU多校第二场 1008 I love exam 背包+DP
在VS2019中编写C语言的链表程序出现了C4473等错误,怎么修改?