2. 大神与三位小伙伴
小数据可以直接求所有全排列,方法可参考编程之美,比较巧妙,纯属练习,这样大数据会超时,应该是要用数学方法推公式直接算。
#include <stdio.h>
#include <vector>
using namespace std;
typedef unsigned long long ULL;
ULL Solve(ULL N) {
ULL sum = 0;
vector<ULL> arr(3, 1);
int cur = 3 - 1;
while (cur != -1) {
cur = 3 - 1;
while (cur != -1) {
if (arr[cur] < N) {
++arr[cur];
if ((arr[0] ^ arr[1] && arr[1] ^ arr[2] && arr[0] ^ arr[2]) || (arr[0] == arr[1] && arr[1] == arr[2])) {
ULL tmp = 1;
for (int i = 0; i < 3; tmp *= arr[i], ++i) {}
sum += tmp;
}
break;
} else {
arr[cur--] = 1;
}
}
}
return sum += 1;
}
int main() {
int T;
ULL N;
scanf("%d", &T);
for (int c = 1; T--; c++) {
scanf("%llu", &N);
ULL sum = Solve(N);
printf("Case %d: %llu\n", c, sum);
}
return 0;
}