题目描述:设f(n)表示正整数n%(a*b)==0的组对数目,求前n项和。
解法:
我们列一下
对于1 有(1,1) 1/1/1=1
对于2 有(1,1) (1,2) (2,1) 2/1/1=2 2/1/2=1 2/2/1=1
对于3 有(1,1) (1,3) (3,1) 3/1/1=3 3/1/3=1 3/3/1=1
于是题目变成了求a*b*c<=n的组数
#include<stdio.h>
int main()
{
int cas=1;
long long n ,i,j,t,a;
while(scanf("%I64d",&n)!= EOF&&n)
{
long long ans=0;
for( i=1;i*i*i<=n;i++) ans++; //a,b, c相同的情况。不用排列
for( i=1;i*i<=n;i++) //a,b,c中有两个一样的情况,比如, a=b,
{
t=n/i/i; // t=c;
if(t>=i) ans+=(t-1)*3; // 如果t>=i,则1~t中不能取i,取了就变成3个i,取完后排列,C(1,3) ;
else ans+=t*3; //若t<i,则不担心出现3个一样的。取完后排列。
}
for( i=1;i*i*i<=n;i++) //3个都不一样的情况
{
t=n/i; //枚举a, t=b*c
for( j=i+1;j*j<=t;j++) // 枚举 b ,
{
a=t/j; //a=c;
if(a>j) //a,b,c的关系是, a<b<=c ; 所以防止b=c的情况。
ans+=(a-j)*6; //三个都不一样,排列。C(2,3) ;
}
}
printf("Case %d: %I64d\n",cas++,ans);
}
return 0;
}