先要了解一下组合数和杨辉三角的关系
C(0,0)
C(1,0) C(1,1)
C(2,0) C(2,1) C(2,2)
杨辉三角大概就是这样一个结构,所以只要一个二维前缀就好了QAQ
就变成了
C(0,0)
C(1,0)+C(0,0) C(1,1)+C(1,0)+C(0,0)
C(2,0)+C(1,0)+C(0,0) C(2,1)+C(2,0)+C(1,0)+C(0,0)+C(1,1) C(2,2)+C(2,1)+C(2,0)+C(1,0)+C(0,0)+C(1,1)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
const long long mod=19260817;
long long i,j,k,p,m,n,a[2001][2001],b[2001][2001];//开上long long保险
int main()
{
cin>>p;
a[1][1]=1;
for(i=2;i<=1200;i++)//虽然时间比较慢,但多算总比少算好
for(j=1;j<=i;j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j]+mod)%mod;//求杨辉三角
//注意加mod后再%mod不然就70 亲测会爆负数
for(i=1;i<=1200;i++)
{
b[2][i]=(b[2][i-1]+a[2][i]+mod)%mod;
b[i][2]=(b[i-1][2]+a[i][2]+mod)%mod;
//这样赋值一下更保险
}
for(i=3;i<=1200;i++)
for(j=3;j<=1200;j++)
b[i][j]=(b[i][j-1]+a[i][j]+b[i-1][j]-b[i-1][j-1]+mod)%mod;//求二维前缀
for(i=1;i<=p;i++)
{
cin>>m>>n;
cout<<b[n+1][m+1]<<endl;//因为第一个数是0,0所以要加一
}
return 0;
}
QAQ