1 2 0
1 1
这道题要用到错排的知识。
题目只要求他答对一半或以上就算过关,换句话说就是猜对了一半以上,其他的全部算是错排。所以就是求1~n/2每项的错排数再乘以组合数(函数c(n,m)求组合数)之和。
HDOJ2049这道题也是这个类型的
#include long long c(int n, int m){ //求组合数 int a = 1; if (m == 0) return 1; for (int i = 1; i <= m; i++){ a = a * (n - i + 1); a = a / i; } return a; } int main(){ int n, i; long long a[30], sum; while (scanf("%d", &n),n){ sum = 1; a[1] = 0; a[2] = 1; for (i = 3; i <= 12; i++) a[i] = (i - 1) * (a[i - 1] + a[i - 2]); //错排公式 for (i = 1; i <= n / 2; i++) sum += a[i] * c(n, i); printf("%I64d\n", sum); } return 0; }