资讯详情

资讯详情

《P17017 [GESP202606 八级] 堆石子》

题目描述有 m 堆石子编号为 1,2,⋯,m其石子数量分别记为 a1​,a2​,⋯,am​。现在要求第 1 堆石子恰有 n 个即 a1​n并且此后每堆石子的数量严格小于前一堆即 ai​ai−1​ (2≤i≤m)。此外每堆至少需要有一个石子即 ai​≥1 (1≤i≤m)。在总石子数量不设限制的情况下给定 m≥2,n≥1有多少个满足要求的石子堆放方案两个方案不同当且仅当两个方案中至少有一堆石子数量不同。如果不存在满足要求的方案输出 0。由于方案数可能很大请输出方案数对 1097 取模后的结果。输入格式输入一行两个正整数 m 和 n。输出格式输出一个整数表示总方案数对 1097 取模后的结果。输入输出样例输入 #1复制3 5输出 #1复制6说明/提示样例解释 1有 (5,4,3)(5,4,2)(5,4,1)(5,3,2)(5,3,1) 和 (5,2,1) 共计 6 种方案。数据范围数据点编号数据范围特殊性质1,22≤m≤100,1≤n≤1000≤n−m≤53,4,52≤m≤100,1≤n≤108无6,7,8,9,102≤m≤105,1≤n≤108代码实现#include iostream using namespace std; typedef long long ll; const int MOD 1e9 7; const int MAXK 1e5 10; ll powmod(ll a, ll b) { ll res 1; while(b) { if(b1) res res * a % MOD; a a * a % MOD; b 1; } return res; } int main() { ll m, n; cin m n; ll K m - 1; ll N n - 1; if(N K) { cout 0 endl; return 0; } ll numer 1; for(ll i 0; i K; i) { ll term (N - i) % MOD; numer numer * term % MOD; } ll fact 1; for(ll i 1; i K; i) { fact fact * i % MOD; } ll inv_fact powmod(fact, MOD - 2); ll ans numer * inv_fact % MOD; cout ans endl; return 0; }
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →