先上代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> num(1,1);
int t,a,n,ans;
void mul(int x){//高精乘代码
int y=0;//进位
for(int i=0;i<num.size();i++){
y+=num[i]*x;
num[i]=y%10;//计算当前位上的数
y/=10;//计算进位
}
while(y){//处理最终进位
num.push_back(y%10);
y/=10;
}
}
int main(){
cin>>t;
while(t--){
cin>>n>>a;
ans=0;//ans每次都要赋为0
num.clear();//同理清空可变长度数组num
num.push_back(1);//num赋初值1
for(int i=1;i<=n;i++) mul(i);//计算阶乘
for(int i=0;i<num.size();i++) ans+=num[i]==a;//计算次数
cout<<ans<<endl;//输出
}
return 0;
}
这里需要求阶乘,很显然数据范围超过long long范围,于是使用高精度乘法。每次求阶乘前都要将需处理的数字赋为1(0乘任何数都得0),并将a出现的次数ans赋为0。
这是本蒟蒻的第二篇题解,如有不同意见可以在评论区提出。