码迷,mamicode.com
首页 > 其他好文 > 详细

HDU5226 Tom and matrix(BestCoder Round #40)

时间:2015-05-10 09:52:01      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

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急着回家,当然不会自己算,所以就把任务交给你了。
因为数可能很大,答案对一个质数p取模。
输入描述
输入包含多组数据(大约8组)。每组数据只有一行五个非负整数,x1y1x2y2p,你要求的是x2i=x1y2j=y1ai,j模p后的值。
x1x2105,y1y2105,2p109
输出描述
对于每组数据输出一行,答案模p。
输入样例
0 0 1 1 7
1 1 2 2 13
1 0 2 1 2
输出样例
3
4
1
大神的代码写的好简洁
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 200010
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
int fact[maxn],inv[maxn],mod;
int Power(int p,int n){
    int ans=1;
    for(;n;n>>=1,p=(LL)p*p%mod)
        if(n&1)
        ans=(LL)ans*p%mod;
    return ans;
}
void Prepare(int n){
    fact[0]=1,inv[0]=1;
    for(int i=1;i<=n&&i<mod;++i)
        fact[i]=(LL)fact[i-1]*i%mod,inv[i]=Power(fact[i],mod-2);
}
int C(int n,int m){
    if(n<m) return 0;
    return (LL)fact[n]*inv[m]%mod*inv[n-m]%mod;
}
int Lucas(int n,int m){
    if(n<mod&&m<mod)
        return C(n,m);
    return (LL)Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod;
}
int work(int lx,int ly,int rx,int ry){
    LL ans=0,now=0;
    for(int i=ly;i<=ry;++i)
        now=(now+Lucas(lx,i))%mod;
    ans=now;
    for(int i=lx+1;i<=rx;++i)
        now=(now*2-Lucas(i-1,ly)-Lucas(i-1,ry)+Lucas(i,ly)+mod+mod)%mod,ans=(ans+now)%mod;
    return ans;
}
int main()
{
    int xa,ya,xb,yb;
    while(cin>>xa>>ya>>xb>>yb>>mod){
        Prepare(100005);
        cout<<work(xa,ya,xb,yb)<<endl;
    }
    return 0;
}


HDU5226 Tom and matrix(BestCoder Round #40)

标签:

原文地址:http://blog.csdn.net/a197p/article/details/45605099

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!