hdu 3037 Saving Beans lucas定理
2016-02-24 19:47
381 查看
题目链接
给n, m, p, 求sigma(i = 0 to m) C(n-1+i, n-1)%p的值。
C(n-1, n-1)+C(n-1+1, n-1)+C(n-1+2, n-1)+.......
= C(n-1, 0)+C(n, 1)+C(n+1, 2)+....
= C(n, 0)+C(n, 1)+C(n+1, 2)+....
根据C(n, k) = C(n-1, k-1)+C(n-1, k) 可以推出来上面的式子最终合并为C(n+m, m)%p。
这个式子直接用lucas定理就可以了。
给n, m, p, 求sigma(i = 0 to m) C(n-1+i, n-1)%p的值。
C(n-1, n-1)+C(n-1+1, n-1)+C(n-1+2, n-1)+.......
= C(n-1, 0)+C(n, 1)+C(n+1, 2)+....
= C(n, 0)+C(n, 1)+C(n+1, 2)+....
根据C(n, k) = C(n-1, k-1)+C(n-1, k) 可以推出来上面的式子最终合并为C(n+m, m)%p。
这个式子直接用lucas定理就可以了。
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #include <queue> #include <stack> #include <bitset> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, n, a) for(int i = a; i<n; i++) #define fi first #define se second typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; ll mod; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; ll pow(ll a, ll b) { ll ret = 1; while(b) { if(b&1) { ret = ret*a%mod; } a = a*a%mod; b >>= 1; } return ret; } ll C(ll n, ll k) { if(n<k) return 0; if(k>n-k) k = n-k; ll s1 = 1, s2 = 1; for(int i = 0; i<k; i++) { s1 = s1*(n-i)%mod; s2 = s2*(i+1)%mod; } return s1*pow(s2, mod-2)%mod; } ll lucas(ll n, ll k) { if(k == 0) return 1; return lucas(n/mod, k/mod)*C(n%mod, k%mod)%mod; } int main() { int t; ll n, m; cin>>t; while(t--) { scanf("%I64d%I64d%I64d", &n, &m, &mod); ll ans = lucas(n+m, m); printf("%I64d\n", ans); } return 0; }
相关文章推荐
- POJ - 2388 Who's in the Middle
- C语言经典书籍
- 网络的最大流最小割定理
- Android的消息循环机制 Looper Handler类分析
- 模板_树链剖分
- yii2的安装使用
- 堆 (heap)
- Android样式的开发:Style篇
- 网页元素
- BZOJ_P1036&Codevs_P2460 [ZJOI2008]树的统计Count(树链剖分)
- Linux文件与目录控制函数讲解
- PAT-1018 锤子剪刀布
- BZOJ1017: [JSOI2008]魔兽地图DotR
- 【转】【iOS测试系列】常用测试小插件的使用
- ArrayList() 输出
- Androidx学习笔记(70)--- 进程优先级
- 如何获取SD卡的 剩余容量和总容量(Eclipse,studio如何导入现存的项目)
- C语言笔记(3)
- POJ - 3481 Double Queue
- php cookie学习