group_allocation.dart 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import 'package:flutter/material.dart';
  2. import 'tool_kit.dart';
  3. /// 分组分配:n 个人分成 k 个**有区别的**组(组不空着)。
  4. ///
  5. /// 先把 n 个人分成 k 堆(第二类斯特林数 S(n,k),堆之间不区分),
  6. /// 再把 k 堆分给 k 个有名字的组(k! 种)—— 所以答案是 k!·S(n,k)。
  7. class GroupAllocationPage extends StatefulWidget {
  8. const GroupAllocationPage({super.key});
  9. @override
  10. State<GroupAllocationPage> createState() => _GroupAllocationPageState();
  11. }
  12. class _GroupAllocationPageState extends State<GroupAllocationPage> {
  13. final _n = ToolField('n (人数)', hint: '正整数');
  14. final _k = ToolField('k (组数)', hint: '正整数');
  15. @override
  16. Widget build(BuildContext context) => ToolScaffold(
  17. title: '分组分配',
  18. fields: [_n, _k],
  19. compute: (session) async {
  20. final n = int.tryParse(_n.text);
  21. final k = int.tryParse(_k.text);
  22. if (n == null || n < 1) throw Exception('n 要填一个正整数');
  23. if (k == null || k < 1) throw Exception('k 要填一个正整数');
  24. return [
  25. ...await exactAndApprox(
  26. session,
  27. '方案数 k!·S($n,$k)',
  28. 'Factorial[$k]*StirlingS2[$n, $k]',
  29. ),
  30. ToolText(
  31. '斯特林数 S($n,$k)',
  32. (await session.compute('StirlingS2[$n, $k]')).text,
  33. ),
  34. ];
  35. },
  36. );
  37. }