Tom and matrix

Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226


Mean:

题意很简单,略。

analyse:

直接可以用Lucas定理+快速幂水过的,但是我却作死的用了另一种方法。

方法一:Lucas定理+快速幂水过

方法二:首先问题可以转化为求(0,0),(n,m)这个子矩阵的所有数之和。画个图容易得到一个做法,对于n<=m,答案就是2^0+2^1+...+2^m=2^(m+1)-1,对于n>m,答案由两部分构成,一部分是2^(m+1)-1,另一部分是sigma i:m+1->n f[i][m],f[i][m]表示第i行前m列的数之和,f数组存在如下关系,f[i][m]=f[i-1][m]*2-C[i-1][m],f[m][m]=2^m。还有另一种思路:第i列的所有数之和为C(i,i)+C(i+1,i)+...+C(n,i)=C(n+1,i+1),于是答案就是sigma i:0->min(n,m) C(n+1,i+1)。

Lucas定理:由于题目给定的模是可变的质数,且质数可能很小,那么就不能直接用阶乘和阶乘的逆相乘了,需要用到Lucas定理,公式:C(n,m)%P=C(n/P,m/P)*C(n%P,m%P),c(n,m)=0(n<m)。当然最终还是要预处理阶乘和阶乘的逆来得到答案。复杂度O(nlogP+nlogn)

Time complexity: O(n)

Source code: 

Lucas定理+快速幂

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-05-21-23.28
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using namespace std;const int maxn=100010;
struct cell
{int x,y;bool operator<(cell c) const{return x==c.x?(y<c.y):(x<c.x);}
}p[2];
LL mod;
LL Pow(LL a,LL b)
{LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return ret%mod;
}
namespace lucas
{LL A[maxn],inv[maxn];void init(){A[0]=1,A[1]=1;inv[1]=1;inv[0]=1;for(int i=2;i<maxn;i++){A[i]=A[i-1]*(LL)i%mod;inv[i]=Pow(A[i],mod-2);}}LL Lucas(LL a,LL b){if(a<b) return 0;if(a<mod&&b<mod) return (A[a]*inv[b]%mod)*inv[a-b]%mod;return Lucas(a/mod,b/mod)*Lucas(a%mod,b%mod)%mod;}
}
using namespace lucas;int main()
{ios_base::sync_with_stdio(false);cin.tie(0);while(cin>>p[0].x>>p[0].y>>p[1].x>>p[1].y>>mod){if(p[0].y>p[0].x&&p[1].y>p[1].x&&p[0].y>p[1].x) {printf("0\n");continue;}init();sort(p,p+2);if(!(p[0].x<=p[1].x && p[0].y<=p[1].y)){int x1=p[0].x,y1=p[0].y,x2=p[1].x,y2=p[1].y;p[0].x=x1,p[0].y=y2,p[1].x=x2,p[1].y=y1;}LL sta=p[0].x,en=p[1].x,h=p[0].y,ans=0;while(h<=p[1].y && sta<=en ){if(sta<h) sta=h;ans=(ans+Lucas(en+1,h+1)-Lucas(sta,h+1)+mod)%mod;h++;}printf("%lld\n",ans);}return 0;
}
/**/

View Code

方法二:

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-05-21-02.58
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using namespace std;
struct cell
{int x,y;bool operator<(cell c) const{return x==c.x?(y<c.y):(x<c.x);}
}p[2];
LL mod;
LL inv[101000],A[101000];
inline LL Pow(LL a,LL b)
{LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return (ret-1)%mod;
}void init()
{A[0]=1,A[1]=1;inv[1]=1;inv[0]=1;for(int i=2;i<101000;i++){A[i]=A[i-1]*(LL)i%mod;inv[i]=Pow(A[i],mod-2);}
}
LL Lucas(LL a,LL b)
{if(a<b) return 0;if(a<mod&&b<mod) return (A[a]*inv[b]%mod)*inv[a-b]%mod;return Lucas(a/mod,b/mod)*Lucas(a%mod,b%mod)%mod;
}inline LL Pow(LL b)
{b=b+1;if(b<0) return 0;LL a=2;LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return (ret-1)%mod;
}inline int calc_Matrix(int x,int y)
{if(x<0||y<0) return 0;if(x<=y)return Pow(x);else{LL sum1=Pow(y);LL tmp=Pow(y)-Pow(y-1);LL sum2=0;for(int i=y+1;i<=x;++i){tmp=tmp*2-(int)Lucas((LL)i-1,(LL)y);tmp%=mod;sum2+=tmp;sum2%=mod;}return (sum1+sum2)%mod;}
}
int main()
{ios_base::sync_with_stdio(false);cin.tie(0);while(cin>>p[0].x>>p[0].y>>p[1].x>>p[1].y>>mod){if(p[0].y>p[0].x&&p[1].y>p[1].x&&p[0].y>p[1].x) {printf("0\n");continue;}init();sort(p,p+2);if(!(p[0].x<=p[1].x && p[0].y<=p[1].y)){int x1=p[0].x,y1=p[0].y,x2=p[1].x,y2=p[1].y;p[0].x=x1,p[0].y=y2,p[1].x=x2,p[1].y=y1;}cout<<(calc_Matrix(p[1].x,p[1].y)-calc_Matrix(p[0].x-1,p[1].y)-calc_Matrix(p[1].x,p[0].y-1)+calc_Matrix(p[0].x-1,p[0].y-1))%mod<<endl;}return 0;
}
/**/

View Code

组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix相关推荐

  1. HDU 5226 Tom and matrix(组合数学+Lucas定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...

  2. 【ACM】杭电OJ 4704 Sum (隔板原理+组合数求和公式+费马小定理+快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4704 1.隔板原理 1~N有N个元素,每个元素代表一个1.分成K个数,即在(N-1)个空挡里放置(K-1)块隔板 ...

  3. 1916. 统计为蚁群构筑房间的不同顺序 费马小定理+快速幂+DFS

    1916. 统计为蚁群构筑房间的不同顺序 你是一只蚂蚁,负责为蚁群构筑 n 间编号从 0 到 n-1 的新房间.给你一个 下标从 0 开始 且长度为 n 的整数数组 prevRoom 作为扩建计划.其 ...

  4. 51nod 1513-3的幂的和(费马小定理+快速幂)

    题目: 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 输入一个数N(0 <= N <= 10^9) Output 输出:计算结果 Sample ...

  5. 牛客训练四:Applese 涂颜色(费马小定理+快速幂)

    题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了. 所以总共有2^n中结果. 由于n太大,所以要用到费马小定理a^n%mod= ...

  6. [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)

    题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...

  7. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

    题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...

  8. 递推+矩阵快速幂 HDU 2065

    1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace ...

  9. Killer Names( 容斥定理,快速幂 )

    题目大意: m种不同颜色的球,填两组盒子,每组盒子有n个,两组盒子中不能有相同颜色的球,问方法总数有多少. 解题思路:利用容斥定理,m种颜色放入n个格子共有m^n个,但其中肯定有不满足m种颜色的,所以 ...

最新文章

  1. flume 1.7在windows下的安装与运行
  2. 如何解决普通用户使用sudo找不到命令
  3. excel 科学计数法转换成文本完整显示_避免万次暴击,巧办法解决数字和文本之间的快速转化...
  4. Excel插件类库的设计思路
  5. 请简述计算机硬件系统的运行过程,操作系统简述题
  6. 达梦工作笔记-将A表的ID插入到B表,将A表的数据更新到B表
  7. php网站本地调试工具,php本地调试工具-php/asp网站程序本地调试工具下载 v5.1--pc6下载站...
  8. linux---拷贝文件夹命令
  9. 更改VS.NET 默认SCM Provider的方法
  10. FFmpeg转码音视频不同步情况总结
  11. 如何在论文后面插参考文献
  12. python校园网站毕业设计开题报告
  13. html meta标签使用总结(转)
  14. cadence软件初识
  15. PPT画图软件,强烈推荐!提升能力的利器。
  16. 干货:自助分析BI产品实践指南
  17. RMON学习笔记(一)
  18. 推荐一个非常好的IOS编程技巧网站
  19. 华清见远 pcie网卡驱动_使用PCIe交换网结构在多主机系统中优化资源部署
  20. python yield 与 yield from

热门文章

  1. excel mysql实时交换数据_Excel与数据库的数据交互
  2. python命令行进入帮助模式_python命令行模式直接查看帮助
  3. spss process插件_SPSS教程:绘制调节效应图
  4. 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
  5. 多核处理器_多核处理器还能走多远?2050年用上1024核CPU
  6. python需要安装的库_使用python学习【机器学习】需要安装的库~
  7. php strval,PHP strval()函数
  8. 12v小型电机型号大全_伊藤8KW静音柴油发电机YT8100T型号规格
  9. php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. mysql b 树 b树_MySQL B树和B+树的区别