思路:
将条件转化为满足abc<=n的abc的数目。
1.3个数相等时,为 A;
2.有2个数相等时,为 B;
3.都不相等时,为 C。
则结果为A+3*B+6*C。
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #define ll __int64 9 using namespace std; 10 int main(){ 11 ll n,m,ans,i,j,k,v; 12 int c=0; 13 while(scanf("%I64d",&n)!=EOF){ 14 m=(ll)pow(n,1.0/3);//i=j=k 15 ans=m; 16 if((m+1)*(m+1)*(m+1)==n) ans++; 17 for(i=1;i<=m;i++){ 18 v=(ll)sqrt(n/i); 19 ans+=(n/(i*i)-i+v-i)*3;//i=j , j=k 20 for(j=i+1;j<=v;j++){ 21 ans+=(n/(i*j)-j)*6;//i!=j!=k 22 } 23 } 24 printf("Case %d: %I64d ",++c,ans); 25 } 26 return 0; 27 }