题目链接:http://acm.swust.edu.cn/problem/0247/

Time limit(ms): 1000        Memory limit(kb): 65535
Description
在很久很久以前,有个臭美国王。一天,他得到了一件新衣,于是决定巡城看看老百姓的反应(囧)。于是他命令可怜的宰相数一下他有多少种巡城方案。 
城市是一个N*M的矩形,(N+1)*(M+1)条街把城市分成了N*M块。国王从左下角出发,每次只能向右或向上走,右上角是终点。 
请你帮帮可怜的宰相。

Input

每组测试数据有3个值 n m p(0< n <=1000000000,0 < m <=1000000000,p为质数且p<400). 
Output
多组测试数据 0 0 0结束。
输出方案数 因为数据太大 请 mod p

Sample Input

2 3 97
20 40 37
0 0 0
Sample Output

10
32
Hint
2009暑期ACM集训组队赛《一》 -- 剑问苍生
解题思路:从左下角到右上角的方案数,那么(假设方阵大小n*m)
     (1)向上必须移动n格,向右必然移动m格
     (2)只需要以向上或向右移动为基准求C(n+m) n 或者C(n+m) m的组合数即可,好好想想为什么吧~~~~
        可以有一个优化组合数上面的去n,m中的较小值(组合数性质)
     (3)发现n,m<=1000000000那么在求组合数的时候肯定会直接爆掉,那怕是在求的过程中不断MOD 数p,
       那么我们以p的上限值为界求组合数,运用Lucas定理求解
Lucas定理:(详情可以戳戳这里:http://www.cnblogs.com/zyxStar/p/4588362.html)

      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定理)相关推荐

  1. 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

    Tom and matrix Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...

  2. 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 ...

  3. 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] ...

  4. BZOJ4737 组合数问题 【Lucas定理 + 数位dp】

    题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...

  5. Lucas定理与大组合数的取模的求法总结

    Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38  1219人阅读  评论(0)  收藏  举报 c 首先给出这个Lucas定理: A.B是非负整数 ...

  6. 数论(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 ...

  7. 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 ...

  8. 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)

    题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...

  9. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

最新文章

  1. Windows下PCL1.9.1配置(编译源码)
  2. The RAII Programming Idiom
  3. JVM怎么判断对象是否存活
  4. 在DataTable中进行数据查询 (转)
  5. newifimini出厂固件_新路由mini固件|newifi新路由mini OS固件V3.2.1.1100 抢先版 - 极光下载站...
  6. C++开发工程师的薪资和未来发展
  7. CSDN—编写博客(快捷键)
  8. Fiddler4 抓包分析(基础版)
  9. zepto获取html内容,基于Zepto的内容滑动插件:zepto.hwSlider.js
  10. 分享Echarts饼状图显示信息,内容,值,百分比都显示的代码
  11. 超星网络学生登录入口 附使用教程
  12. python统计形容词权重然后排序
  13. 计组(六)流水线技术
  14. spring boot学习2,日志框架
  15. win7 任务栏图标计算机,电脑系统win7怎么修改任务栏的图标
  16. Unity 回合制战斗系统(中级篇)-血条和伤害数值
  17. Java实现用汉明距离进行图片相似度检测的
  18. 值得收藏!EEG/ MEG/MRI/ fNIRS公开数据库大盘点
  19. 【Linux操作系统】——安装CentOS系统
  20. Python - 3.6 学习二

热门文章

  1. 最小错误率贝叶斯决策
  2. Win7局域网打印机共享设置(详细图文流程)
  3. 监控工具—Prometheus—监控Redis
  4. android开发中Switch开关在Dialog中不显示
  5. 简单线性回归预测实现
  6. Linux有问必答:如何检查Linux的内存使用状况
  7. PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较
  8. 使用requireJS的shim參数,完毕jquery插件的载入
  9. webform 简单的服务器控件。
  10. 安全类链接,https