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≤105,y1≤y2≤105,2≤p≤109

输出描述

对于每组数据输出一行,答案模p。

输入样例

0 0 1 1 7
1 1 2 2 13
1 0 2 1 2

输出样例

3
4
1

对于一个 矩阵的排列组合,C(X1,Y1) +C(X1,Y1+1)+....+(C(X1,Y2)=C(X1+1,Y2)-C(X1,Y1+1);        每一列都可以这样化,所以后面就是:C(X,Y)%P的问题,这里证明LUCAS定律C(X,Y)=【C(X/P,Y/P)+(X%P,Y%P)】%P;来自百度百科:

复习lucas

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <cmath>
 8 #define LL long long
 9 using namespace std;
10 const int N = 100010;
11 const int mod = 1000000007;
12 LL f[N],num[N];
13 LL p;
14 void init()
15 {
16     f[0]=1;
17     for(int i=1;i<=N-5;i++)
18     {
19         int tmp=i;
20         num[i]=num[i-1];
21         while(tmp%p==0)
22         {
23             num[i]++;
24             tmp/=p;
25         }
26         f[i]=f[i-1]*tmp%p;
27     }
28 }
29
30 LL inv(LL a,LL n)
31 {
32     LL res=1;
33     a%=p;
34     while(n)
35     {
36         if(n&1)res=res*a%p;
37         a=a*a%p;
38         n>>=1;
39     }
40     return res;
41 }
42
43 LL calc(int a,int b)
44 {
45     if(a<b)return 0;
46     if(num[a]-num[b]-num[a-b])return 0;
47     else return f[a]*inv(f[b],p-2)%p*inv(f[a-b],p-2)%p;
48 }
49 //先提取出阶乘里面的P 后面才能求逆元
50 int main()
51 {
52     int x1,y1,x2,y2;
53
54     while(scanf("%d%d%d%d%I64d",&x1,&y1,&x2,&y2,&p)>0)
55     {
56         init();
57         LL ans=0;
58         for(int i=y1;i<=y2;i++)
59         {
60             ans=((ans+calc(x2+1,i+1)-calc(x1,i+1))%p+p)%p;
61         }
62         printf("%I64d\n",ans);
63     }
64 }

因为p是素数,所以a!=0 关于p的逆为 a^-1=a^(p-2)%p;小费马定理

‘因为p 很小 所以要先预处理 阶乘可不可过能能mod p==0;


				
时间: 2024-10-29 10:46:56

Bestcoder Tom and matrix的相关文章

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急着回家,当然

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

题意: 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

BestCoder#40 C Tom and matrix

传送门在这里 题意:求Sum(C[i][j]) (x1<=i<=x2;y1<=j<=y2),结果对质数p取模 思路:由c[i][j]=c[i-1][j-1]+c[i-1][j]可知Sum(C[i][k]) = C[b+1][k+1]-C[a][k+1] (a<=i<=b),所以枚举所有的j算出C[x2+1][j+1]-C[x1][j+1]即可.计算c[n][m]对p取模的值需要用到Lucas定理. Lucas定理:C[n][m]%p=C[n/p][m/p]*C]n%p]

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 5671 Matrix (BestCoder Round #81 (div.2) 1002)

传送门 Matrix Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 311    Accepted Submission(s): 142 Problem Description There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000).Then we

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

HDU5569/BestCoder Round #63 (div.2) C.matrix DP

matrix Problem Description Given a matrix with n rows and m columns ( n+m is an odd number ), at first , you begin with the number at top-left corner (1,1) and you want to go to the number at bottom-right corner (n,m). And you must go right or go dow

BestCoder Round #40 1001——精度——Tom and paper

Problem 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 In the first line, there is an integer T indicates the numb