之前的 (LaTeX) 有点崩了,修改一下。
这题大家可能第一下想到的方法就是枚举 (1) 到 (n),逐一判断这些数是否为 (k) 的倍数,这种做法的时间复杂度为: (Theta(n))。
其实还有一种做法是枚举小于 (n) 的 (k) 的倍数,求出它们的和,即为 A 集合;再用总和减去 A 集合元素的和,即为 B 集合。当 (kleq n) 时,此方法的时间复杂度为: (Theta(lfloorfrac{n}{k} floor))。总和的话用等差数列求和公式就行了。
至于 (k>n),那么 A 集合的元素和就是 (0),B 集合的元素和就是总和。
#include<bits/stdc++.h>
using namespace std;
int n,k,sum; //sum 为小于 n 的 k 的倍数的数量。
double a1,a2;
int main()
{
scanf("%d%d",&n,&k);
if(k>n) //k>n 时,特判一下。
{
printf("0.0 %.1lf",(1+n)*1.0/2);
return 0;
}
for(register int i=1;i*k<=n;i++) //集合 A 的元素和。
a1+=i*k,sum++;
a2=(1+n)*n/2; //集合 B 的元素和。
a2-=a1;
a1/=sum; //求平均。
a2/=n-sum;
printf("%.1lf %.1lf",a1,a2);
return 0;
}
PS:如果您不知道何为等差数列求和公式(废话,xxs 都知道),请看这里:
[sum^n_{i=1}{a_i}=frac{(a_1+a_n) imes n}{2}
]