题目:有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:
fun(A)
sum = 0
for i = 1 to A.length
for j = i+1 to A.length
sum = sum + Floor((A[i]+A[j])/(A[i]*A[j]))
return sum
给出数组A,由你来计算fun(A)的结果。例如:A = {1, 4, 1},fun(A) = [5/4] + [2/1] + [5/4] = 1 + 2 + 1 = 4。
解析:注意到对于Floor((A[i]+A[j])/(A[i]*A[j])),也就是说等于Floor(1/A[i] + 1/A[j]),对于数组A来说是正整数,所以可分为A[i]为1或2或大于2三类。
void solve()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int n, x, count1 = 0, count2 = 0, count3 = 0;
RDI(n);
REP(i, n)
{
RDI(x);
if(x == 1) count1++;
else if(x == 2) count2++;
else count3++;
}
printf("%d\n", count1 * (n - 1) + count2 * (count2 - 1) / 2;
}