组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix
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相关推荐
- 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 < ...
- 【ACM】杭电OJ 4704 Sum (隔板原理+组合数求和公式+费马小定理+快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=4704 1.隔板原理 1~N有N个元素,每个元素代表一个1.分成K个数,即在(N-1)个空挡里放置(K-1)块隔板 ...
- 1916. 统计为蚁群构筑房间的不同顺序 费马小定理+快速幂+DFS
1916. 统计为蚁群构筑房间的不同顺序 你是一只蚂蚁,负责为蚁群构筑 n 间编号从 0 到 n-1 的新房间.给你一个 下标从 0 开始 且长度为 n 的整数数组 prevRoom 作为扩建计划.其 ...
- 51nod 1513-3的幂的和(费马小定理+快速幂)
题目: 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 输入一个数N(0 <= N <= 10^9) Output 输出:计算结果 Sample ...
- 牛客训练四:Applese 涂颜色(费马小定理+快速幂)
题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了. 所以总共有2^n中结果. 由于n太大,所以要用到费马小定理a^n%mod= ...
- [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...
- 递推+矩阵快速幂 HDU 2065
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace ...
- Killer Names( 容斥定理,快速幂 )
题目大意: m种不同颜色的球,填两组盒子,每组盒子有n个,两组盒子中不能有相同颜色的球,问方法总数有多少. 解题思路:利用容斥定理,m种颜色放入n个格子共有m^n个,但其中肯定有不满足m种颜色的,所以 ...
最新文章
- flume 1.7在windows下的安装与运行
- 如何解决普通用户使用sudo找不到命令
- excel 科学计数法转换成文本完整显示_避免万次暴击,巧办法解决数字和文本之间的快速转化...
- Excel插件类库的设计思路
- 请简述计算机硬件系统的运行过程,操作系统简述题
- 达梦工作笔记-将A表的ID插入到B表,将A表的数据更新到B表
- php网站本地调试工具,php本地调试工具-php/asp网站程序本地调试工具下载 v5.1--pc6下载站...
- linux---拷贝文件夹命令
- 更改VS.NET 默认SCM Provider的方法
- FFmpeg转码音视频不同步情况总结
- 如何在论文后面插参考文献
- python校园网站毕业设计开题报告
- html meta标签使用总结(转)
- cadence软件初识
- PPT画图软件,强烈推荐!提升能力的利器。
- 干货:自助分析BI产品实践指南
- RMON学习笔记(一)
- 推荐一个非常好的IOS编程技巧网站
- 华清见远 pcie网卡驱动_使用PCIe交换网结构在多主机系统中优化资源部署
- python yield 与 yield from
热门文章
- excel mysql实时交换数据_Excel与数据库的数据交互
- python命令行进入帮助模式_python命令行模式直接查看帮助
- spss process插件_SPSS教程:绘制调节效应图
- 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
- 多核处理器_多核处理器还能走多远?2050年用上1024核CPU
- python需要安装的库_使用python学习【机器学习】需要安装的库~
- php strval,PHP strval()函数
- 12v小型电机型号大全_伊藤8KW静音柴油发电机YT8100T型号规格
- php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...
- mysql b 树 b树_MySQL B树和B+树的区别