hdu 5226 Tom and matrix

题意:

Tom放学回家的路上,看到天空中出现一个矩阵。Tom发现,如果矩阵的行、列从0开始标号,第i行第j列的数记为a[i][j],那么a[i][j]=C(i,j)

如果i < j,那么a[i][j]=0

Tom突发奇想,想求一个矩形范围((x1,y1),(x2,y2))内所有数的和。Tom急着回家,当然不会自己算,所以就把任务交给你了。

因为数可能很大,答案对一个质数p取模。

限制:

0 <= x1 <= x2 <=1e5

0 <= y1 <= y2 <=1e5

2 <= p <= 1e9

思路:

sigma(i=a~b,C(i,k)) = C(b+1,k+1) - C(a,k+1)

还有注意模的时候注意要消除除数要与p消除公因子,再计算。也可以用lucas定理。

/*hdu 5226 Tom and matrix
  题意:
  Tom放学回家的路上,看到天空中出现一个矩阵。Tom发现,如果矩阵的行、列从0开始标号,第i行第j列的数记为a[i][j],那么a[i][j]=C(i,j)
  如果i < j,那么a[i][j]=0
  Tom突发奇想,想求一个矩形范围((x1,y1),(x2,y2))内所有数的和。Tom急着回家,当然不会自己算,所以就把任务交给你了。
  因为数可能很大,答案对一个质数p取模。
  限制:
  0 <= x1 <= x2 <=1e5
  0 <= y1 <= y2 <=1e5
  2 <= p <= 1e9
  思路:
  sigma(i=a~b,C(i,k)) = C(b+1,k+1) - C(a,k+1)
  还有注意模的时候注意要消除除数要与p消除公因子,再计算。也可以用lucas定理。
 */
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL __int64
const int N=1e5+5;
LL f[N],ny[N];
int cnt[N];
LL inv(LL a,LL m){
	LL p=1,q=0,b=m,c,d;
	while(b>0){
		c=a/b;
		d=a; a=b; b=d%b;
		d=p; p=q; q=d-c*q;
	}
	return p<0?p+m:p;
}

void predo(int n,int MOD){
	f[0]=1;
	ny[0]=inv(1,MOD);
	for(int i=1;i<=n;++i){
		int tmp=i;
		while(tmp%MOD==0) tmp/=MOD;
		f[i]=f[i-1]*tmp%MOD;
		ny[i]=inv(f[i],MOD);
	}
	memset(cnt,0,sizeof(cnt));
	for(int i=2;i<=n;++i)
		for(int j=i/MOD;j>0;j/=MOD)
			cnt[i]+=j;
}
LL C(int n,int k,int MOD){
	if(k>n) return 0;
	int num=cnt[n]-cnt[k]-cnt[n-k];
	if(num) return 0;
	return f[n]*ny[k]%MOD*ny[n-k]%MOD;
}
LL cal(int l,int r,int k,int MOD){
	if(l>r) return 0;
	return (C(r+1,k+1,MOD)-C(l,k+1,MOD)+MOD)%MOD;
}
void gao(int x1,int y1,int x2,int y2,int MOD){
	LL ans=0;
	for(int i=y1;i<=y2;++i){
		int l=max(i,x1);
		int r=x2;
		//cout<<l<<' '<<r<<' '<<i<<' ';
		ans=(ans+cal(l,r,i,MOD))%MOD;
		//cout<<ans<<endl;
	}
	printf("%I64d\n",ans);
}
int main(){
	int x1,y1,x2,y2,p;
	while(scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&p)!=EOF){
		predo(max(x2,y2)+2,p);
		gao(x1,y1,x2,y2,p);
	}
	return 0;
}

时间: 2024-11-07 21:15:29

hdu 5226 Tom and matrix的相关文章

组合数(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

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 < 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). 由于

hdu 5225 Tom and permutation(回溯)

题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 100; const int mod = 1e9+7; int N, ans, V[maxn + 5], A[maxn + 5]; ll S[maxn + 5], L[m

HDU5226 Tom and matrix(BestCoder Round #40)

Tom and matrix Accepts: 29 Submissions: 225 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 Tom放学回家的路上,看到天空中出现一个矩阵.Tom发现,如果矩阵的行.列从0开始标号,第i行第j列的数记为ai,j,那么ai,j=Cji 如果i < j,那么ai,j=0 Tom突发奇想,想求一个矩形范围内所有数的和.Tom急着回家,当然

hdu Uncle Tom&#39;s Inherited Land*(1*2矩阵覆盖,最大匹配)

http://acm.hdu.edu.cn/showproblem.php?pid=1507 大致题意:在一个n*m的格子上,黑色的地方不可用,问在白色格子上最多可放多少1*2的矩阵. 思路:建图,每个白色格子与它临近的上下左右的白色格子建边,求最大匹配,答案为最大匹配/2,因为是双向图.最后输出匹配边时,当找到一组匹配边记得将该边标记,以防重复计算. #include <stdio.h> #include <algorithm> #include <set> #inc

hdu 5224 Tom and paper

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5224 Tom and paper Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this paper. Input I

Bestcoder Tom and matrix

问题描述 Tom放学回家的路上,看到天空中出现一个矩阵.Tom发现,如果矩阵的行.列从0开始标号,第i行第j列的数记为ai,j,那么ai,j=Cji 如果i < j,那么ai,j=0 Tom突发奇想,想求一个矩形范围内所有数的和.Tom急着回家,当然不会自己算,所以就把任务交给你了. 因为数可能很大,答案对一个质数p取模. 输入描述 输入包含多组数据(大约8组).每组数据只有一行五个非负整数,x1.y1.x2.y2.p,你要求的是∑x2i=x1∑y2j=y1ai,j模p后的值. x1≤x2≤10

HDU 5224 Tom and paper(BestCoder Round #40)

题目链接:Tom and paper 题面: Tom and paper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 679    Accepted Submission(s): 432 Problem Description There is a piece of paper in front of Tom, its length

HDU 5224 Tom and paper(最小周长)

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this pap