CSP-J1 2020 第 15 题:
有五副不同颜色的手套(共 10 只手套,每副手套左右手各 1 只),一次性从中取 6 只手套,请问恰好能配成两副手套的不同取法有( )种。
A.120 B.180 C.150 D.30 正确答案:A
这题我的思路:总共 5 双手套,要配成 2 双,可能数就是 C(5,2)=10。然后就要在剩下 6 只里再取 2 只,先取一只,可能性就是 C(6,1)=6 种。再取一只,由于不能和上一只是一对,可能性就是 C(4,1)=4 种,总共就是 10×6×4=240 种。
然后我发现,选项里根本就没有 240。于是我就问了老师,老师看了我的做法后也说,这不挺对的吗,也没啥问题啊,然后就说这题不好说,要再看看。我就用程序生成了一下表。
// 这是表生成器
#include <bits/stdc++.h>
using namespace std;
string s[12] = {"","","a1","a2","b1","b2","c1","c2","d1","d2","e1","e2"};
bool vis[12];
struct node {
int id, x;
} a[7];
int main() {
for(int i=1; i<5; i++) {
for(int j=i+1; j<=5; j++) {
vis[i*2] = vis[i*2+1] = vis[j*2] = vis[j*2+1] = true;
int cnt = 0;
for(int k=1; k<=10; k++) {
if(vis[k]==false) {
a[++cnt].id = cnt;
a[cnt].x = k;
}
}
for(int k=1; k<=6; k++) {
vis[a[k].x] = true;
if(a[k].x&1) vis[a[k].x-1] = true;
else vis[a[k].x+1] = true;
for(int l=1; l<=6; l++) {
cout << s[i*2] << ' ' << s[i*2+1] << ' ' << s[j*2] << ' ' << s[j*2+1] << ' ';
cout << s[a[k].x] << ' ';
if(!vis[a[l].x]) {
vis[a[l].x] = true;
cout << s[a[l].x] << ' ';
vis[a[l].x] = false;
}
cout << '\n';
}
vis[a[k].x] = false;
if(a[k].x&1) vis[a[k].x-1] = false;
else vis[a[k].x+1] = false;
}
vis[i*2] = vis[i*2+1] = vis[j*2] = vis[j*2+1] = false;
}
}
return 0;
}
虽然这程序不完全正确,但打出来的表没问题。在我将表经过筛选、去重等操作后,最终的表如下(a1 代表第一双手套的左手,a2 就是右手,以此类推):
// 这是表,经本人反复检查,确认无重无漏
a1 a2 b1 b2 c1 d1
a1 a2 b1 b2 c1 d2
a1 a2 b1 b2 c1 e1
a1 a2 b1 b2 c2 d1
a1 a2 b1 b2 c2 d2
a1 a2 b1 b2 c2 e1
a1 a2 b1 b2 d1 e1
a1 a2 b1 b2 d2 e1
a1 a2 c1 c2 b1 d1
a1 a2 c1 c2 b1 d2
a1 a2 c1 c2 b1 e1
a1 a2 c1 c2 b2 d1
a1 a2 c1 c2 b2 d2
a1 a2 c1 c2 b2 e1
a1 a2 c1 c2 d1 e1
a1 a2 c1 c2 d2 e1
a1 a2 d1 d2 b1 c1
a1 a2 d1 d2 b1 c2
a1 a2 d1 d2 b1 e1
a1 a2 d1 d2 b2 c1
a1 a2 d1 d2 b2 c2
a1 a2 d1 d2 b2 e1
a1 a2 d1 d2 c1 e1
a1 a2 d1 d2 c2 e1
a1 a2 e1 e2 b1 c1
a1 a2 e1 e2 b1 c2
a1 a2 e1 e2 b1 d1
a1 a2 e1 e2 b2 c1
a1 a2 e1 e2 b2 c2
a1 a2 e1 e2 b2 d1
a1 a2 e1 e2 c1 d1
a1 a2 e1 e2 c2 d1
b1 b2 c1 c2 a1 d1
b1 b2 c1 c2 a1 d2
b1 b2 c1 c2 a1 e1
b1 b2 c1 c2 a2 d1
b1 b2 c1 c2 a2 d2
b1 b2 c1 c2 a2 e1
b1 b2 c1 c2 d1 e1
b1 b2 c1 c2 d2 e1
b1 b2 d1 d2 a1 c1
b1 b2 d1 d2 a1 c2
b1 b2 d1 d2 a1 e1
b1 b2 d1 d2 a2 c1
b1 b2 d1 d2 a2 c2
b1 b2 d1 d2 a2 e1
b1 b2 d1 d2 c1 e1
b1 b2 d1 d2 c2 e1
b1 b2 e1 e2 a1 c1
b1 b2 e1 e2 a1 c2
b1 b2 e1 e2 a1 d1
b1 b2 e1 e2 a2 c1
b1 b2 e1 e2 a2 c2
b1 b2 e1 e2 a2 d1
b1 b2 e1 e2 c1 d1
b1 b2 e1 e2 c2 d1
c1 c2 d1 d2 a1 b1
c1 c2 d1 d2 a1 b2
c1 c2 d1 d2 a1 e1
c1 c2 d1 d2 a2 b1
c1 c2 d1 d2 a2 b2
c1 c2 d1 d2 a2 e1
c1 c2 d1 d2 b1 e1
c1 c2 d1 d2 b2 e1
c1 c2 e1 e2 a1 b1
c1 c2 e1 e2 a1 b2
c1 c2 e1 e2 a1 d1
c1 c2 e1 e2 a2 b1
c1 c2 e1 e2 a2 b2
c1 c2 e1 e2 a2 d1
c1 c2 e1 e2 b1 d1
c1 c2 e1 e2 b2 d1
d1 d2 e1 e2 a1 b1
d1 d2 e1 e2 a1 b2
d1 d2 e1 e2 a1 c1
d1 d2 e1 e2 a2 b1
d1 d2 e1 e2 a2 b2
d1 d2 e1 e2 a2 c1
d1 d2 e1 e2 b1 c1
d1 d2 e1 e2 b2 c1
总共就 80 行。
所以哪来的 120?不是 240 就是 80。求大佬帮忙解答。