Xuegg @ 2023-03-24 16:59:40
//为什么以下算法会错?
#include<iostream>
#include<string.h>
#define MAXN 10000
using namespace std;
struct Bigint{
int b[MAXN],len; // a表示要将整数转换为数组,len记录位数
Bigint(int x = 0){
memset(b,0,sizeof(b));
for(int len = 1;x;len++){
b[len] = x % 10;
x /= 10;
}
len--;
}
int &operator[](int i){
return b[i];
}//重载操作符[], 可以用 x[i] 代表 x.a[i]
void flatten(int L){//展平,一口气处理1到L范围内的进位并重置长度。
len = L;
for(int i = 1;i <= len;i++){
b[i + 1] += b[i] / 10;
b[i] %= 10;
}
while(b[len] == 0){
len -- ;
}
}
int cntNum(int a){
int cnt = 0;
for(int i = max(1,len);i >= 1;i--){
if(a == b[i]) cnt ++;
}
return cnt;
}
};
Bigint operator* (Bigint e, int c){
Bigint d(0);
int len = e.len;
for(int i = 1;i <= len;i++){
d[i] = e[i] * c;
}
d.flatten(len + 11);
return d;
}
int main(){
int t = 0,cnt = 0;
int n = 0,a = 0;
cin >> t;
for(int i = 1;i <= t;i++){
Bigint ans(1);
cin >> n >> a;
for(int j = 1;j <= n;j++){
ans = ans * j;
}
cout << ans.cntNum(a) <<endl;
}
return 0;
}