像这种题感觉有点难找规律,所以不强求,但是还是写个博客记录一下。这道题稍作推敲就会发现只有当a或b为1或2时才能使等式floor((a+b)/(a*b))不为0。其他都为0,其中的数学推理,应该是基本不等式。a+b>=2*sqrt(a*b)。则(a+b)/(a*b)>=2*sqrt(a*b)/(a*b).
#include <stdio.h>int main(int argc, const char * argv[])
{int N;int i, j = 0;long long A[100001];long long sum = 0;scanf("%d", &N);for (i = 0; i < N; i++){scanf("%lld", A + i);if (A[i] == 2) //2单独处理{j++;}else if (A[i] == 1) //这里考虑到1和非1组合时结果为1、1和1组合时结果为2,{ //而1和1的组合会被利用两次,所以与前者归并在一起考虑(C(1,N-1)sum += N - 1;}}printf("%lld\n", sum + j * (j - 1) / 2); //因为2和2组合会被利用两次 C(2,j-1);return 0;
}