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; }