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 createState() => _GroupAllocationPageState(); } class _GroupAllocationPageState extends State { final _n = ToolField('n (人数)', hint: '正整数', keyboard: TextInputType.number); final _k = ToolField('k (组数)', hint: '正整数', keyboard: TextInputType.number); @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, ), ]; }, ); }