原文链接: 组合数学 加法法则和乘法法则
例1.1.6
•1) 求小于10000的含1的正整数的个数
•2) 求小于10000的含0的正整数的个数
1)小于10000的不含1的正整数可看做4位数, 但0000除外. 故有9×9×9×9-1=6560个.
含1的有:9999-6560=3439个
另: 全部4位数有10^4个,不含1的四位数有9^4 个, 含1的4位数为两个的差: 10^4 -9^4 = 3439个。
2) 不含0的1位数有9个,2位数有9^2个,3位数有9^3个,4位数有9^4个,故不含0小于10000的正整数有
9+9^2 +9^3 +9^4 =(95-1)/(9-1)=7380个;
含0小于10000的正整数有:9999-7380=2619个
注:“含0”和“含1”不可直接套用。0019含1但不含0。在组合的习题中有许多类似的隐含的规定,要特别留神。
let c1 = 0
let c0 = 0
for (let i = 1; i < 10000; i++) {
String(i).includes('0') ? c0++ : c0
String(i).includes('1') ? c1++ : c1
}
console.log(c0, c1)
2619 3439
Ø例1.2.2:从[1,300]中取3个不同的数,使这3个数的和能被3整除,有多少种方案?
解:将[1,300]分成3类:
A={i|i≡1(mod 3)}={1,4,7,…,298},
B={i|i≡2(mod 3)}={2,5,8,…,299},
C={i|i≡3(mod 3)}={3,6,9,…,300}.
要满足条件,有四种解法:
1)3个数同属于A; 2)3个数同属于B
3)3个数同属于C; 4)A,B,C各取一数.
故共有3*C(100,3)+100^3 =485100+1000000=1485100
由于三个数没有顺序,所以按照由大到小进行枚举
let c = 0
for (let i = 1; i <= 300; i++)
for (let j = i + 1; j <= 300; j++)
for (let k = j + 1; k <= 300; k++)
// i != j && j != k && i != k && (((i + j + k) % 3) == 0) ? c++ : c
if (i != j && j != k && i != k && (((i + j + k) % 3) == 0))
c++
console.log(c);
1485100
这种枚举方式会使答案变大,因为三个数是不同的
for (let i = 1; i <= 300; i++)
for (let j = 1; j <= 300; j++)
for (let k = 1; k <= 300; k++)