| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- import 'package:flutter/material.dart';
- import 'tool_kit.dart';
- /// 分组分配:n 个人分成 k 个**有区别的**组(组不空着)。
- ///
- /// 先把 n 个人分成 k 堆(第二类斯特林数 S(n,k),堆之间不区分),
- /// 再把 k 堆分给 k 个有名字的组(k! 种)—— 所以答案是 k!·S(n,k)。
- class GroupAllocationPage extends StatefulWidget {
- const GroupAllocationPage({super.key});
- @override
- State<GroupAllocationPage> createState() => _GroupAllocationPageState();
- }
- class _GroupAllocationPageState extends State<GroupAllocationPage> {
- final _n = ToolField('n (人数)', hint: '正整数');
- final _k = ToolField('k (组数)', hint: '正整数');
- @override
- Widget build(BuildContext context) => ToolScaffold(
- title: '分组分配',
- fields: [_n, _k],
- compute: (session) async {
- final n = int.tryParse(_n.text);
- final k = int.tryParse(_k.text);
- if (n == null || n < 1) throw Exception('n 要填一个正整数');
- if (k == null || k < 1) throw Exception('k 要填一个正整数');
- return [
- ...await exactAndApprox(
- session,
- '方案数 k!·S($n,$k)',
- 'Factorial[$k]*StirlingS2[$n, $k]',
- ),
- ToolText(
- '斯特林数 S($n,$k)',
- (await session.compute('StirlingS2[$n, $k]')).text,
- ),
- ];
- },
- );
- }
|