解法很好想哟
2333是个质数,而且很小,Lucas走起
诶不会用编辑器打同余符号,题解不写了
/**************************************************************
Problem: 4591
User: di4CoveRy
Language: C++
Result: Accepted
Time:4580 ms
Memory:71604 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#define N 3000
#define p 2333
using namespace std;
typedef long long LL;
int C[N][N],sum[N][N];
int Lucas(LL x,LL y) {
if (y > x) return 0;
if (x <= p && y <= p) return C[x][y];
return Lucas(x/p,y/p) * Lucas(x%p,y%p) % p;
}
int calc(LL n,LL k) {
if (n < p)
return sum[n][k];
else
return ( calc(n/p,k/p-1) * sum[n%p][p-1] + Lucas(n/p,k/p) * sum[n%p][k%p] ) % p;
}
void solve() {
LL n,k;
scanf("%lld%lld",&n,&k);
printf("%d\n",calc(n,k));
}
void pre() {
for (int i=0;i<=p;i++) C[i][0] = C[i][i] = 1;
for (int i=1;i<=p;i++)
for (int j=1;j<=p;j++) C[i][j] = ( C[i-1][j] + C[i-1][j-1] ) % p;
for (int i=0;i<=p;i++)
for (int j=0;j<=p;j++) sum[i][j] = j==0 ? C[i][j] : ( ( sum[i][j-1] + C[i][j] ) % p );
return ;
}
int main() {
pre();
int T=0; scanf("%d",&T);
while (T--) solve();
return 0;
}