题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226

题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < j),求(x1,y1),(x2,y2)这个子矩阵里面的所有数的和。

思路:首先可以推导出一个公式C(n,i)+C(n + 1,i)+...+C(m,i) = C(m + 1,i + 1)

知道了这个公式,就可以将子矩阵里每行(或每列)的和值表示成组合数的差值,现在的关键是求出C(n,m)(mod p).

由于n和m可能很大,p很小,不能直接求,要借助Lucas定理。关于Lucas定理,可参考:http://www.cnblogs.com/zxndgv/archive/2011/09/17/2179591.html。

code:

 1 #include <cstdio>
 2 typedef __int64 LL;
 3 const int MAXN = 100005;
 4 int p;
 5 LL fac[MAXN];
 6
 7 // 得到阶乘  fac[i] = i! % p
 8 void GetFact()
 9 {
10     fac[0] = 1;
11     for (LL i = 1; i < MAXN; ++i)
12         fac[i] = fac[i - 1] * i % p;
13 }
14
15 // 快速模幂 a^b % p
16 LL Pow(LL a, LL b)
17 {
18     LL temp = a % p;
19     LL ret = 1;
20     while (b)
21     {
22         if (b & 1) ret = ret * temp % p;
23         temp = temp * temp % p;
24         b >>= 1;
25     }
26     return ret;
27 }
28
29 /*
30 欧拉定理求逆元
31 (a / b) (mod p) = (a * x) (mod p) x表示b的逆元 并且 b * x = 1 (mod p) 只有b和p互质才存在逆元
32
33 b * x = 1 (mod p) x是b关于p的逆元
34
35 b^phi(p) = 1 (mod p)
36
37 b * b^(phi(p) - 1) (mod p) = b * x (mod p)
38
39 x = b^(phi(p) - 1) = b^(p - 2)
40
41 (a / b) (mod p) = (a * x) (mod p) = (a * b^(p - 2)) (mod p)
42
43 经过上面的推导,得出:
44
45 (a / b) (mod p) = (a * b^(p - 2)) (mod p) (b 和 p互质)
46
47 */
48 LL Cal(LL n, LL m)
49 {
50     if (m > n) return 0;
51     return fac[n] * Pow(fac[m] * fac[n - m], p - 2) % p;
52 }
53
54 LL Lucas(LL n, LL m)
55 {
56     if (m == 0) return 1;
57     return Cal(n % p, m % p) * Lucas(n / p, m / p) % p;
58 }
59
60 int main()
61 {
62     int x1, y1, x2, y2;
63     while (scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &p) == 5)
64     {
65         if (x2 < y1)    // 预判 子矩阵全部0值区域
66         {
67             printf("0\n");
68             continue;
69         }
70         if (x2 == y1)   // 预判 子矩阵只有右上角值为1,其余为0
71         {
72             printf("1\n");
73             continue;
74         }
75         GetFact();
76         if (x1 < y1) x1 = y1;
77         if (y2 > x2) y2 = x2;
78         LL ans = 0;
79         for (int i = y1; i <= y2; ++i)
80         {
81             if (i > x1)
82                 ans = (ans + Lucas(x2 + 1, i + 1)) % p;
83             else
84                 ans = (ans + Lucas(x2 + 1, i + 1) - Lucas(x1 + 1, i + 1) + Lucas(x1, i)) % p;
85         }
86         printf("%I64d\n", ans);
87     }
88     return 0;
89 }

转载于:https://www.cnblogs.com/ykzou/p/4494969.html

HDU 5226 Tom and matrix(组合数学+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. szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}

    给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...

  3. stone (组合数学 + Lucas定理)

    传送门 解题思路:第i组的人数必须大于Ci,于是我们可以将问题转化为\(N-\sum_{i=1}^M Ci\)人分到M组中,且保证每一组的人数大于0,然后我们可以使用隔板法求出分的的组数\(C_{N- ...

  4. hdu 3944 DP? (Lucas 定理)

    仔细观察杨辉三角后可以发现从最高点到第n行第k个数的最短路为c(n+1,k); 根据Lucas定理可以求出,一般来说要求答案模去一个质数p且p的范围不大于10^5则可用Lucas. Lucas(n,m ...

  5. hdu 3037 Lucas定理

    题目可以转换成 x1+x2+--+xn=m 有多少组解,m在题中可以取0-m. x1+x2+...+xn = m的解的个数,利用插板法可以得到方案数为: (m+1)*(m+2)...(m+n-1) = ...

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

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

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

  8. [学习笔记]扩展LUCAS定理

    可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...

  9. 【数论-Lucas定理】

    1.写在前面:我始终觉得,对于一个问题要知其然,更要知其所以然.Lucas定理在刚刚接触数论的时候就知道了,因为这是一个很常用的定理,常常和中国剩余定理放在一起考.最近在组合数学上出现了很多问题,但是 ...

最新文章

  1. 在Android Studio中打开Android Device Monitor时报错的解决方法
  2. 【设计模式】前端控制器模式
  3. python c++操作raw文件
  4. GDCM:gdcm::CompositeNetworkFunctions的测试程序
  5. RabbitMQ消息幂等性问题
  6. react中类组件this指向
  7. patchGAN再次理解【相比于原始D全图输出true/false,patchGAN可以关注更多的区域】
  8. java中的POJO、PO、VO分别是什么?
  9. python语音转文字源码_python文字转语音实现过程解析
  10. 机器学习笔记(二十四):召回率、混淆矩阵
  11. php融云开源sdk使用im,开源项目索引
  12. 苹果开发者账号的申请
  13. int类型变量的取值范围?
  14. Unix/Linux下的Curse库开发指南——第六章 菜单开发及应用
  15. 黑盒测试用例设计方法-等价类划分法
  16. “嫦娥四号”探测器凌晨发射,中国探月计划第二阶段进入尾声
  17. 题目:L1-079 天梯赛的善良
  18. 电影《诛仙Ⅰ》:“IP加流量的话”现在还可以行得通吗
  19. vue2 mixins混入
  20. SWC与SWF的区别

热门文章

  1. MAC下载Linux Centos镜像文件
  2. java基础-容器-Set
  3. 复习HTML+CSS(2)
  4. python自动生成excel报表
  5. How Kafka’s Storage Internals Work
  6. 简单的html5 readAsDataURL img和base64互相转换
  7. OpenCV2学习笔记(一)
  8. 图像对象paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决...
  9. 解决Windows下栈内存过小的问题
  10. 基于阿里的Node全栈之路(二)阿里负载均衡的HTTPS优化方案