标签:int 集合 can std spl line space bit pre
之前的 \(\LaTeX\) 有点崩了,修改一下。
这题大家可能第一下想到的方法就是枚举 \(1\) 到 \(n\),逐一判断这些数是否为 \(k\) 的倍数,这种做法的时间复杂度为: \(\Theta(n)\)。
其实还有一种做法是枚举小于 \(n\) 的 \(k\) 的倍数,求出它们的和,即为 A 集合;再用总和减去 A 集合元素的和,即为 B 集合。当 \(k\leq n\) 时,此方法的时间复杂度为: \(\Theta(\lfloor\frac{n}{k}\rfloor)\)。总和的话用等差数列求和公式就行了。
至于 \(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 都知道),请看这里:
标签:int 集合 can std spl line space bit pre
原文地址:https://www.cnblogs.com/win10crz/p/12859721.html