x+y+z<=k
x+y+z+d=k
就等价于把k个东西放到4个框里,隔板法
因为可以为空所以先补4个空格,共k-1+4个空格,取3个隔板,分4份
即c(3,k-1+4)
c(3,k+3)=(k+1)*(k+2)*(k+3)/6%m
(k+1)*(k+2)/6*(k+3)会爆longlong,所以%m要放到(k+1)*(k+2)%m
(k+1)*(k+2)*(k+3)/6%m 因为(k+1)*(k+2)*(k+3)%6=0
=(k+1)*(k+2)*(k+3)%(m*6)/6
=(k+1)*(k+2)%(m*6)*(k+3)%(m*6)/6
#include <bits/stdc++.h>
using namespace std;
long long t,k,m;
int main(int argc, char** argv) {
cin>>t;
while(t--){
scanf("%lld%lld",&k,&m);
long long ans=1LL*(k+3)*(k+2)%(m*6);
ans=ans*(k+1)%(6*m)/6;
cout<<ans<<endl;
}
return 0;
} 
京公网安备 11010502036488号