标签:
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
大神的代码写的好简洁
#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