hdu 3944 lucas
来源:互联网 发布:网络售后服务包括 编辑:程序博客网 时间:2024/05/22 12:55
需要分情况讨论。
然后求组合数 套上lucas。
#include <bits/stdc++.h>using namespace std;typedef long long ll;ll n, k, p;ll powmod(ll a, ll b){ ll res = 1; a %= p; while(b){ if(b&1) res = res*a%p; b>>=1; a = a*a%p; } return res; }ll fac[1310][10100];bool is[100010];int cnt;int pr[10010];int id[10010];void init(){ cnt = 0; for(int i=2; i<=10000; i++){ if(!is[i]){ pr[++cnt] = i; id[i] = cnt; for(int j=i+i; j<=10000; j+=i) is[j] = true; } } for(int i=1; i<=cnt; i++){ fac[i][0] = 1; for(int j=1; j<=10000; j++){ fac[i][j] = fac[i][j-1] * j % pr[i]; } }}ll getc(int n, int m, ll p, int tmp){ if(m > n) return 0; ll res = fac[tmp][n]*powmod(fac[tmp][n-m]*fac[tmp][m]%p, p-2)%p; return res;}ll lucas(int n, int m, ll p, int tmp){ if(m == 0) return 1; return lucas(n/p, m/p, p, tmp)*getc(n%p, m%p, p, tmp)%p;}int main(){ int icase = 0; init(); while(~scanf("%lld %lld %lld", &n, &k, &p)){ int tmp = id[p]; if(k > n/2) k = n- k; ll res = lucas(n+1, k, p, tmp); printf("Case #%d: %lld\n", ++icase, (res + n - k)%p); } return 0;}
0 0
- hdu 3944 lucas
- hdu 3944 DP? lucas定理
- HDU 3944 DP?------Lucas 大组合数取余
- HDU 3944-DP?(Lucas定理+预处理)
- 帕斯卡公式+Lucas定理______DP?( hdu 3944 )
- hdu 3944 DP? (Lucas定理)
- [HDU 3944] DP?组合数 Lucas定理
- hdu 3944 (预处理组合数Lucas
- hdu 3037 lucas定理
- HDU 4349(Lucas 变形)
- HDU 5698 (数学 lucas)
- hdu 4349(Lucas定理)
- hdu 5894 组合Lucas
- hdu 3944 Lucas定理--大组合数取模 多校赛
- HDU 3944 DP?(lucas定理 组合数)
- HDU 3037 (大数&LUCAS定理)
- hdu 3037 排列组合+Lucas定理
- HDU 3037 lucas + 费马小定理
- 九度OJ 1150:Counterfeit Dollar(假美元) (分析、检验)
- github、操作系统 资料收集
- codevs1376帕秋莉•诺蕾姬 东方幻想乡系列模拟赛Stage 2[三星]
- Python if elif else语句
- HTML学习笔记之CSS基础知识
- hdu 3944 lucas
- NOIp 2006 能量项链
- Hibernate-映射关系- 基于外键映射的1<->1映射
- 技术人生“白天求生存,晚上谋发展”
- 运行报错:查询块具有不正确的结果列数
- 判断一个数是不是2的幕
- 最小生成树
- iPhone屏幕投射到Mac的解决方案
- hiho 2 Trie树