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][m%p]%p

令a=n%p,b=m%p,

则C[a][b]=a!/(b!*(a-b)!)

由于b!*(a-b)!与p互质,由费马小定理,C[a][b]=a!*(b!*(a-b)!)^(p-2)

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define LL long long

LL PowMod(LL a,LL b,LL MOD){
    LL ret=1;
    while(b){
        if(b&1) ret=(ret*a)%MOD;
        a=(a*a)%MOD;
        b>>=1;
    }
    return ret;
}

LL fac[100005];
LL GetFact(LL p){
    fac[0]=1;
    for(LL i=1;i<=100000;i++){
        fac[i]=fac[i-1]*i%p;
    }
}

LL Lucas(LL n,LL m,LL p){
    if(n<m) return 0;
    LL ret=1;
    while(n&&m){
        LL a=n%p,b=m%p;
        if(a<b) return 0;
        ret=(ret*fac[a]*PowMod(fac[b]*fac[a-b]%p,p-2,p))%p;
        n/=p;m/=p;
    }
    return ret;
}

int main(){
    int x1,x2,y1,y2,p;
    while(scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&p)!=EOF){
        GetFact(p);
        LL ans=0;
        for(int i=y1+1;i<=y2+1;i++){
            ans=(ans+Lucas(x2+1,i,p)-Lucas(x1,i,p)+p)%p;
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-11 02:46:41

BestCoder#40 C 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 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 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). 由于

bestcode round #40 1001 Tom and paper

问题描述: 已知一个矩形的面积,求最小周长 示例: 12(1*12.3*4),最小周长为(3+4)*2=14 解题分析: #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int main() { int n,T; cin>>T; while(T--) { cin>>n; int ans = 2*(

acdeream Matrix Multiplication

D - Matrix Multiplication Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus Problem Description Let us consider undirected graph G = {V; E} which has N vertices and M edges. Incidence matrix of this graph i

【leetcode】Search 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right.The first integer of each row is greater than the last integer of the previous row

UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))(A + A^2 + A^3 + ... + A^(m/2)),然后依次计算下去,就可以分解,logn的复杂度分解,注意要分奇偶. 另一种是直接构造矩阵,,然后就可以用辞阵快速幂计算了,注意要用分块矩阵的乘法. 代码如下: 倍增法: #pragma comment(linker, "/STACK:10