[Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/
城市是一个N*M的矩形,(N+1)*(M+1)条街把城市分成了N*M块。国王从左下角出发,每次只能向右或向上走,右上角是终点。
请你帮帮可怜的宰相。
多组测试数据 0 0 0结束。
2 3 97
20 40 37
0 0 0
|
10
32
|
Lucas定理用来求C(a,b)mod p的值,其中p为素数。
数学表达式为:
Lucas(a,b,q)=C(a%q,b%q)*Lucas(a/p,b/p,p);
Lucas(a,0,q)=0;
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
a ^ b % p = ((a % p)^b) % p (4)
代码如下:
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 405 5 using namespace std; 6 long long dp[maxn][maxn], n, m, p; 7 long long Lucas(long long n, long long m, long long p){ 8 //Lucas定理 9 if (n <= p && m <= p) 10 return dp[n][m]; 11 else 12 return (Lucas(n / p, m / p, p)*dp[n%p][m%p]) % p; 13 } 14 15 //杨辉三角求组合数 16 void init(){ 17 int i, left, right; 18 for (i = 1; i <= p; i++){ 19 dp[i][0] = dp[i][i] = 1; 20 left = 1, right = i - 1; 21 while (left <= right){ 22 dp[i][left] = (dp[i - 1][left - 1] + dp[i - 1][left]) % p; 23 dp[i][right--] = dp[i][left++];//组合数性质dp[i][j]=dp[i][i-j]; 24 } 25 } 26 } 27 int main(){ 28 while (cin >> n >> m >> p && n && m && p){ 29 memset(dp, 0, sizeof(dp)); 30 init(); 31 cout << Lucas(n + m, min(n, m), p) << endl; 32 } 33 return 0; 34 }
View Code
乱搞的Java代码如下:
1 import java.math.*; 2 import java.io.*; 3 import java.util.*; 4 public class Main{ 5 static int DP[][] = new int[401][401]; 6 static int p; 7 public static void main(String[] args) 8 { 9 Scanner cin = new Scanner(System.in); 10 int a, b; 11 while (cin.hasNext()){ 12 a = cin.nextInt(); 13 b = cin.nextInt(); 14 p = cin.nextInt(); 15 if (a == 0) 16 break; 17 initDp(); 18 System.out.println(sloveRe(a + b, b > a ? a : b)); 19 } 20 } 21 private static void initDp(){ 22 int i, j; 23 for (i = 0; i <= p; i++){ 24 DP[i][0] = 1; 25 } 26 for (i = 1; i <= p; i++){ 27 for (j = 1; j <= p; j++){ 28 DP[i][j] = (DP[i - 1][j] + DP[i - 1][j - 1]) % p; 29 } 30 } 31 } 32 private static int sloveRe(int n, int m){ 33 if (n <= p&&m <= p) 34 return DP[n][m]; 35 else 36 return (sloveRe(n / p, m / p)*DP[n%p][m%p]) % p; 37 } 38 }
View Code
转载于:https://www.cnblogs.com/zyxStar/p/4587185.html
[Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)相关推荐
- 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix
Tom and matrix Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok's formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Lucas定理及组合数取模
首先给出这个Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n] ...
- BZOJ4737 组合数问题 【Lucas定理 + 数位dp】
题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...
- Lucas定理与大组合数的取模的求法总结
Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38 1219人阅读 评论(0) 收藏 举报 c 首先给出这个Lucas定理: A.B是非负整数 ...
- 数论(Lucas定理) HDOJ 4349 Xiao Ming's Hope
题目传送门 题意:求C (n,0),C (n,1),C (n,2)...C (n,n)中奇数的个数 分析:Lucas 定理:A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a ...
- BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...
- 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
最新文章
- Windows下PCL1.9.1配置(编译源码)
- The RAII Programming Idiom
- JVM怎么判断对象是否存活
- 在DataTable中进行数据查询 (转)
- newifimini出厂固件_新路由mini固件|newifi新路由mini OS固件V3.2.1.1100 抢先版 - 极光下载站...
- C++开发工程师的薪资和未来发展
- CSDN—编写博客(快捷键)
- Fiddler4 抓包分析(基础版)
- zepto获取html内容,基于Zepto的内容滑动插件:zepto.hwSlider.js
- 分享Echarts饼状图显示信息,内容,值,百分比都显示的代码
- 超星网络学生登录入口 附使用教程
- python统计形容词权重然后排序
- 计组(六)流水线技术
- spring boot学习2,日志框架
- win7 任务栏图标计算机,电脑系统win7怎么修改任务栏的图标
- Unity 回合制战斗系统(中级篇)-血条和伤害数值
- Java实现用汉明距离进行图片相似度检测的
- 值得收藏!EEG/ MEG/MRI/ fNIRS公开数据库大盘点
- 【Linux操作系统】——安装CentOS系统
- Python - 3.6 学习二