版权声明:小媛原创,转载请注明出处! https://blog.csdn.net/xingfushiniziji/article/details/85051598
hdu 4473 exam 数论
注意数据大小,要用long long int
//这道题主要就是转换思路
//一开始完全不知道说啥呢,就是只知道这是一道数论相关的题
//想到这就开始转换思路,(a*b)|n=c,其实就是a*b*c=n;
//分三种情况,第一种3个数相等,第二种2个数相等,第三种三个数均不等
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
long long int n,x=1,coun=0;
while(~scanf("%lld",&n)){
coun=0;
long long int k;
for(long long int i=1;i*i*i<=n;i++) coun++;
for(long long int i=1;i*i<=n;i++){
k=n/i/i;
if(k>=i) coun+=3*(k-1);//因为k不能等于i,所以减掉一种情况
else
coun+=3*k;
}
for(long long int i=1;i*i*i<=n;i++){
for(long long int j=i+1;j<=n;j++){
k=n/i/j;
if(k>j) coun+=(k-j)*6;
else break;//如果不满足k>j的话一定是有重复的,就不是这种三个各不相同情况
}
}
printf("Case %lld: %lld\n",x++,coun);
}
return 0;
}