100pts 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
ll x=0;char c=getchar();bool flag=1;
while(c<'0' || c>'9'){if(c=='-')flag=0;c=getchar();}
while('0'<=c && c<='9'){x=x*10+c-'0';c=getchar();}
return flag?x:-x;
}
const ll N=1e7+1000,p=1e9+7;
ll fac[N];
ll fpow(ll a,ll x){
ll ans=1;
while(x){
if(x&1) ans=ans*a%p;
a=a*a%p,x/=2;
}
return ans;
}
ll inv(ll x){return fpow(x,p-2);}
ll comb(ll n,ll m){
return fac[m]*inv(fac[n]*fac[m-n]%p)%p;
}
ll sum(ll n,ll m){
n--;
ll ans=0;
for(ll i=1;i<=m;i++) ans+=comb(i,i+n),ans%=p;
// printf("%lld %lld %lld\n",n,m,ans);
return ans;
}
int main(){
ll r1=read()+1,c1=read()+1,r2=read()+1,c2=read()+1;
fac[0]=1;
for(ll i=1;i<=1e7+100;i++) fac[i]=fac[i-1]*i%p;
// sum(r1-1,c1-1),sum(r1-1,c2),sum(r2,c1-1),sum(r2,c2);
// for(ll i=1;i<=10;i++){
// for(ll j=i;j<=10;j++) printf("%lld %lld %lld\n",i,j,comb(i,j));
// }
printf("%lld\n",(sum(r2,c2)-((sum(r1-1,c2)+sum(r2,c1-1))%p+p-sum(r1-1,c1-1))%p+p)%p);
}
50pts 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
ll x=0;char c=getchar();bool flag=1;
while(c<'0' || c>'9'){if(c=='-')flag=0;c=getchar();}
while('0'<=c && c<='9'){x=x*10+c-'0';c=getchar();}
return flag?x:-x;
}
const ll N=1e6+1000,p=1e9+7;
ll fac[N];
ll fpow(ll a,ll x){
ll ans=1;
while(x){
if(x&1) ans=ans*a%p;
a=a*a%p,x/=2;
}
return ans;
}
ll inv(ll x){return fpow(x,p-2);}
ll comb(ll n,ll m){
return fac[m]*inv(fac[n]*fac[m-n]%p)%p;
}
ll sum(ll n,ll m){
n--;
ll ans=0;
for(ll i=1;i<=m;i++) ans+=comb(i,i+n),ans%=p;
// printf("%lld %lld %lld\n",n,m,ans);
return ans;
}
int main(){
ll r1=read()+1,c1=read()+1,r2=read()+1,c2=read()+1;
fac[0]=1;
for(ll i=1;i<=1e6+100;i++) fac[i]=fac[i-1]*i%p;
// sum(r1-1,c1-1),sum(r1-1,c2),sum(r2,c1-1),sum(r2,c2);
// for(ll i=1;i<=10;i++){
// for(ll j=i;j<=10;j++) printf("%lld %lld %lld\n",i,j,comb(i,j));
// }
printf("%lld\n",(sum(r2,c2)-((sum(r1-1,c2)+sum(r2,c1-1))%p+p-sum(r1-1,c1-1))%p+p)%p);
}
迷惑...求助大佬解答