组合数(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=;
struct cell
{
int x,y;
bool operator<(cell c) const
{
return x==c.x?(y<c.y):(x<c.x);
}
}p[];
LL mod;
LL Pow(LL a,LL b)
{
LL ret=;
a%=mod;
while(b)
{
if(b&) ret=ret*a%mod;
a=a*a%mod;
b>>=;
}
return ret%mod;
}
namespace lucas
{
LL A[maxn],inv[maxn];
void init()
{
A[]=,A[]=;
inv[]=;inv[]=;
for(int i=;i<maxn;i++)
{A[i]=A[i-]*(LL)i%mod;inv[i]=Pow(A[i],mod-);}
}
LL Lucas(LL a,LL b)
{ if(a<b) return ;
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();
while(cin>>p[].x>>p[].y>>p[].x>>p[].y>>mod)
{
if(p[].y>p[].x&&p[].y>p[].x&&p[].y>p[].x) {printf("0\n");continue;}
init();
sort(p,p+);
if(!(p[].x<=p[].x && p[].y<=p[].y))
{
int x1=p[].x,y1=p[].y,x2=p[].x,y2=p[].y;
p[].x=x1,p[].y=y2,p[].x=x2,p[].y=y1;
}
LL sta=p[].x,en=p[].x,h=p[].y,ans=;
while(h<=p[].y && sta<=en )
{
if(sta<h) sta=h;
ans=(ans+Lucas(en+,h+)-Lucas(sta,h+)+mod)%mod;
h++;
}
printf("%lld\n",ans); }
return ;
}
/* */
方法二:
/*
* 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[];
LL mod;
LL inv[],A[];
inline LL Pow(LL a,LL b)
{
LL ret=;
a%=mod;
while(b)
{
if(b&) ret=ret*a%mod;
a=a*a%mod;
b>>=;
}
return (ret-)%mod;
} void init()
{
A[]=,A[]=;
inv[]=;inv[]=;
for(int i=;i<;i++)
{A[i]=A[i-]*(LL)i%mod;inv[i]=Pow(A[i],mod-);}
}
LL Lucas(LL a,LL b)
{
if(a<b) return ;
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+;
if(b<) return ;
LL a=;
LL ret=;
a%=mod;
while(b)
{
if(b&) ret=ret*a%mod;
a=a*a%mod;
b>>=;
}
return (ret-)%mod;
} inline int calc_Matrix(int x,int y)
{
if(x<||y<) return ;
if(x<=y)
return Pow(x);
else
{
LL sum1=Pow(y);
LL tmp=Pow(y)-Pow(y-);
LL sum2=;
for(int i=y+;i<=x;++i)
{
tmp=tmp*-(int)Lucas((LL)i-,(LL)y);
tmp%=mod;
sum2+=tmp;
sum2%=mod;
}
return (sum1+sum2)%mod;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie();
while(cin>>p[].x>>p[].y>>p[].x>>p[].y>>mod)
{
if(p[].y>p[].x&&p[].y>p[].x&&p[].y>p[].x) {printf("0\n");continue;}
init();
sort(p,p+);
if(!(p[].x<=p[].x && p[].y<=p[].y))
{
int x1=p[].x,y1=p[].y,x2=p[].x,y2=p[].y;
p[].x=x1,p[].y=y2,p[].x=x2,p[].y=y1;
}
cout<<(calc_Matrix(p[].x,p[].y)-calc_Matrix(p[].x-,p[].y)-calc_Matrix(p[].x,p[].y-)+calc_Matrix(p[].x-,p[].y-))%mod<<endl;
}
return ;
}
/* */
组合数(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 < ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
- 【组合数+Lucas定理模板】HDU 3037 Saving
acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...
- uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)
uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...
- HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sample Outp ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)
题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m ...
- hdu 4704 sum(费马小定理+快速幂)
题意: 这题意看了很久.. s(k)表示的是把n分成k个正整数的和,有多少种分法. 例如: n=4时, s(1)=1 4 s(2)=3 1,3 3,1 2,2 s ...
随机推荐
- 使用cocos2d-x v3.1开发小游戏(基本框架)
小游戏的组成 欢迎界面 在游戏资源未全部加载完之前就需要载入,避免进入游戏会有一段黑屏时间. 可以用来展示游戏名称或者开发者logo. 开始菜单界面 一般用于显示游戏名称和关卡选择(或者称游戏难度选择 ...
- 《objective-c基础教程》学习笔记(七)—— 存取方法
在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系.在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(accessor)方法的使用.所谓存取方法,就是用来读取或改变某个对象属性的方法. ...
- Oracle外键不加索引会引起死锁问题
转载链接:http://www.jb51.net/article/50161.htm 这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 ...
- ASP.NET MVC 的自定义模型属性别名绑定
最近在研究 ASP.NET MVC 模型绑定,发现 DefaultModelBinder 有一个弊端,就是无法实现对浏览器请求参数的自定义,最初的想法是想为实体模型的属性设置特性(Attribute) ...
- mem_fun 例子
// functional_mem_fun.cpp // compile with: /EHsc #include <vector> #include <functional> ...
- Android 模拟器 获得 root权限
启动一个模拟器,开始-运行-输入cmd,打开dos,依次输入 adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system ...
- 转:CWnd的函数,以后可以在这儿找了!
CWnd CObject └CCmdTarget └CWnd CWnd类提供了微软基础类库中所有窗口类的基本功能.CWnd对象与Windows的窗口不同,但是两者有紧密联系.CWnd对象是由 ...
- Android之TextView文字绘制流程
一:TextView的onDraw()方法: 1.第一句restartMarqueeIfNeeded()绘制字幕滚动. protected void onDraw(Canvas canvas) { r ...
- CCF推荐国际学术会议
类别如下计算机系统与高性能计算,计算机网络,网络与信息安全,软件工程,系统软件与程序设计语言,数据库.数据挖掘与内容检索,计算机科学理论,计算机图形学与多媒体,人工智能与模式识别,人机交互与普适计算, ...
- Javascript this 关键字
Javascript 的 this 关键字总是指向当前被执行函数的所有者. 换句话说,如果当前函数可以视为某个对象的一个方法,那么 this 就指向该对象. 例如有这么一个函数 doSomething ...