LightOJ
来源:互联网 发布:熟练使用软件 英文 编辑:程序博客网 时间:2024/06/06 02:08
题意:
求组合数 C(n,m)
思路:
我们知道 C(n,m) = (n!) / (m! * (n-m)!)
但是这里的 n m 都很大,而且需要对 mod 取模,所以需要用到 逆元处理分数取模问题
求逆元可以用扩展欧几里得算法或者费马小定理(快速幂)算法;
这里是用到的是 有费马小定理推出来 运用快速幂:
费马小定理: a ^ (m - 1) % ( m ) 恒等于 1
可以推出:(a) * (a ^(m-2)) % m = 1; 并且有: (a)*(1/a) % m = 1;
所以 (1/a)% m = ( a ^ ( m-2 ) ) % m;
也就是说 a ^ ( m - 2) 是 a 对于m取模的 逆元;
ac代码如下:
#include<iostream>#include<algorithm>#include<cstdio>using namespace std;typedef long long ll;const int maxn = 1e6 + 7, maxd = 1e6 + 7;const ll mod = 1000003;int n, m;ll f[maxn];void init() { f[0] = 1; for(int i = 1; i <= mod; ++i) { f[i] = (f[i-1] * i) % mod; }}ll pow(ll a, ll b) { ll res = 1; while(b) { if(b & 1) res = (res * a) % mod; a = (a * a) % mod; b /= 2; } return res;}ll lucas() { ll res = 1; int a = n%mod, b = m%mod; res = ( res * f[a] * pow(f[b] * f[a-b] % mod, mod-2) ) % mod; return res;}int main() { init(); int T; scanf("%d", &T); for(int tt = 1; tt <= T; ++tt) { scanf("%d %d", &n, &m); ll ans = lucas(); printf("Case %d: %d\n", tt, ans); } return 0;}
阅读全文
1 0
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- [LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- 巧用File的renameto方法实现文件的批量重命名以及文件移动
- JVM学习----查看堆栈信息
- OpenCV的源代码编译
- jdk 1.8 stream 小结
- 生活
- LightOJ
- Android 字体国际化适配方法以及源码解析
- myslq服务安装启动
- RN签名、验签
- JVM参数设置、分析
- Resource annotation is not supported on static fields
- 菱形
- java结构型设计模式——组合模式
- php div每20个一循环高性能方法