(⊙v⊙)嗯。其实这题我是看了题解才开始做的。然后又DEBUG了几个小时。。。。
发现以前居然没有实际意义上的DEBUG过。!!真的是惭愧。
现在终于明白对着一个WA掉得代码debug上几个小时真的是!!!多么的有意义!!!!【摔!】
第一是感觉自己真的真的想问题不是很周到。所以我这种就是高中的时候做那种“1. a<0 0<b<x 2.a<0 b....."经常漏情况那种人。。或者就是。。。看到一道题。。啊!不就是这样嘛!然后刷刷刷。。之后发现旁边的人都写得老长老长。。。。。
第二是DEBUG需要方向。捋一捋DEBUG的思路。错了就应该先思考是不是思路错了,觉得没错的话就看看是不是哪里代码没有处理好。手动举几个例子(小数据) 看看中间过程哪里错了。还不行就和AC程序对拍,看看大数据上有没有问题。我是在这里卡了。刚开始是大数据一测就有问题。于是就看中间过程有没有错。后来发现是思路错了。改了之后发现大数据都过了还是不对。于是,在我说完”我测得数据都是对的!“之后。。。。随手输入一个小数据就错掉了。。。秒速打脸有没有。。其实应该想到的,大数据都对了那一定是边界错了。
思路题解上讲的挺清楚的了,不多说。
其实看到题目的时候。。满心想的是。。数论啊不做不做!!
Tom and matrix
代码:
#include <stdio.h>
#include <iostream>
using namespace std;
#define maxn 101000
#define ll long long
ll A[maxn],inv[maxn];
ll mod;
ll Pow(ll a,ll b)
{
ll ret=1;
a%=mod;
while(b)
{
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b>>=1;
}
return ret%mod;
}
void init()
{
A[0]=1,A[1]=1;
inv[1]=1;inv[0]=1;
for(int i=2;i<maxn;i++)
{A[i]=A[i-1]*(ll)i%mod;inv[i]=Pow(A[i],mod-2);}
}
ll C(ll a,ll b)
{
if(a<b) return 0;
if(a<mod&&b<mod) return (A[a]*inv[b]%mod)*inv[a-b]%mod;
return C(a/mod,b/mod)*C(a%mod,b%mod)%mod;
}
int main()
{
ll x,xx,y,yy;
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&xx,&yy,&mod)!=EOF)
{
init();
ll ans=0;
if(y>x&&yy>xx&&y>xx) {printf("0\n");continue;}
if(y>x) x=y;
if(yy>xx) yy=xx;
ll st=x,en=xx,h=y;
while(h<=yy&&st<=en)
{
if(st<h) st=h;
ans=(ans+C(en+1,h+1)-C(st,h+1)+mod)%mod;
h++;
}
printf("%lld\n",ans);
}
return 0;
}