首页 > 代码库 > UVA11609 - Teams(组合数学+快速幂)
UVA11609 - Teams(组合数学+快速幂)
题目链接
题意:从N个人中选出K个人为一只队伍(1 <= K <= N),每个队伍都要有一个队长,当队长不同时,所代表的队伍也不同,求一共可以选出多少只队伍。
思路:依题目可得ans = sum(i * C(i, n)),化简可得ans = n * sum(C(i, n - 1)) = n * 2 ^ (n - 1)。之后用快速幂求解。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> typedef long long ll; const int MOD = 1000000007; using namespace std; ll n; /*ll pow_mod(ll k) { if (k == 0) return 1; if (k == 1) return 2; ll a = pow_mod(k / 2); ll ans = a * a % MOD; if (k % 2) ans = ans * 2 % MOD; return ans; }*/ ll pow_mod(ll k) { ll ans = 1; ll temp = 2; while (k) { if (k & 1) ans = ans * temp % MOD; k >>= 1; temp = (temp * temp) % MOD; } return ans; } int main() { int cas, t = 1; scanf("%d", &cas); while (cas--) { scanf("%lld", &n); ll ans = pow_mod(n - 1); ans = ans * n % MOD; printf("Case #%d: %lld\n", t++, ans); } return 0; }
UVA11609 - Teams(组合数学+快速幂)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。