用一个数组arr[i][j]储存,i表示有几位数,j表示尾数不大于j的有几个
随便写一下就能发现规律:
两位数时最后一位大于j的个数分别为:1,3,6 ,10,15,21,28,36 ,45 ,55;
两位数时最后一位大于j的个数分别为:1,4,10,20,35,56,84,120,165,220
i>=2时:arr[i][j]=arr[i-1][j]+arr[i][j-1]
注意i为1的情况就好,直接输出10
int 会爆表,用 long long
#include <iostream>
using namespace std;
long long arr[65][10];
void deal(){
for(int i=1; i <= 64; ++i) arr[i][0]=1;
for(int i=1; i < 10; ++i)
arr[1][i]=arr[1][i-1]+1;
for(int i=2; i <= 64; ++i){
for(int j=1; j < 10; ++j)
arr[i][j]=arr[i-1][j]+arr[i][j-1];
}
}
int main()
{
deal();
int test;
cin >> test;
while(test--){
int num,n;
cin >> num >> n;
cout << num << " " << arr[n][9] << endl;
}
}