[toj4111] Binomial efficient
2015-08-18 00:17
357 查看
求(nk)(mod232){n \choose k}\pmod {2^{32}}
(nk)=n!k!(n−k)!{n \choose k}={n!\over{k!(n-k)!}}根据上式,只需要枚举各质数的指数即可。即得到如下形式:
2a1×3a2×5a3…2b1×3b2×5b3⋯×2c1×3c2×5c3…=2a1−b1−c1×3a2−b2−c2×5a3−b3−c3…\begin{align}
&{{2^{a1}\times3^{a2}\times5^{a3}\dots}\over{2^{b1}\times3^{b2}\times5^{b3}\dots\times2^{c1}\times3^{c2}\times5^{c3}\dots}}\\
&\\
&= 2^{a1-b1-c1}\times3^{a2-b2-c2}\times5^{a3-b3-c3}\dots\\
\end{align}
先筛出质数,然后枚举各质数,对每个质数,算出各指数即可/* ********************************************** File Name: 4111.cpp Auther: zhengdongjian@tju.edu.cn Created Time: 2015年08月17日 星期一 19时46分13秒 *********************************************** */ #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ui; const ll MOD = 1LL << 32; const int MAX = 1000007; bool is_prime[MAX]; int prime[MAX], tot; int times[MAX]; int get_prime() { memset(is_prime, true, sizeof(is_prime)); for (int i = 2; i <= MAX / i; ++i) { for (int j = i * i; j < MAX; j += i) { is_prime[j] = false; } } tot = 0; for (int i = 2; i < MAX; ++i) { if (is_prime[i]) { prime[tot++] = i; } } return tot; } int gao(int p, int n) { //printf("gao %d, %d: ", p, n); int sum = 0; for (ll i = p; i <= n; i *= p) { sum += n / i; } //printf("%d\n", sum); return sum; } ui fast_pow(ui a, int n) { ui res = 1; while (n) { if (n & 1) res *= a; a *= a; n >>= 1; } return res; } int main() { ios::sync_with_stdio(false); get_prime(); int T; cin >> T; while (T--) { int n, k; cin >> n >> k; if (k == 0) { cout << 1 << endl; continue; } memset(times, 0, sizeof(times)); for (int i = 0; prime[i] <= n; ++i) { times[i] += gao(prime[i], n); times[i] -= gao(prime[i], k); times[i] -= gao(prime[i], n - k); } ui res = 1; for (int i = 0; prime[i] <= n; ++i) { //printf("pair %d^%d\n", prime[i], times[i]); res *= fast_pow(prime[i], times[i]); res %= MOD; } cout << res << endl; } return 0; }
相关文章推荐
- Oracle Coherence中文教程八:启动和停止群集成员
- MVC不仅仅是设计模式
- jQuery中的append()和prepend(),after()和before()的区别
- Class.getResource与Class.getClassLoader.getResource归纳整理
- wpf 对一个集合操作的时候,怎么保留单张的信息
- Oracle Coherence中文教程六:Coherence集群简介
- java语言实现jsp页面验证码
- linux下互斥锁的使用
- java8 新特性
- Android开发中那些相见恨晚的方法、类、接口、工具
- nginx+tomcat+memcached实现session共享
- android tabhost Intent实现
- SqlServer 根据字段分类汇总信息
- Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
- HDOJ-2066-一个人的旅行(最短路)
- 小技巧:Windows Server 2012&R2 WiFi 无法连接问题
- Codeforces Gym 100431G Persistent Queue 可持久化队列
- [LeetCode] Word Search
- Oracle Coherence中文教程五:Coherence调试
- Largest Number