0
已解决
李承耀
新手光能
新手光能
题目链接: 酷町堂:3473
3473 阶乘数码
经验值:1200 时间限制:1000毫秒 内存限制:128MB
题目描述 Description
给定两个正整数n, k,请你求出n!中数码k出现的次数。
输入描述 Input Description
第一行为t(<=10),表示数据组数;
接下来t行,每行包括两个正整数:n(<=1000), k
输出描述 Output Description
对于每组数据,输出一个整数,表示n!中k出现的次数。
样例输入 Sample Input
2 5 2 7 0
样例输出 Sample Output
1 2
WA0:
#include<iostream>
using namespace std;
string chen(string s1,string s2){
int a[20005]={0},b[20005]={0},c[40005]={0};
a[0]=s1.size();
b[0]=s2.size();
c[0]=a[0]+b[0];
for(int i=1;i<=a[0];i++){
a[i]=s1[a[0]-i]-48;
}
for(int i=1;i<=b[0];i++){
b[i]=s2[b[0]-i]-48;
}
for(int i=1;i<=a[0];i++){
for(int j=1;j<=b[0];j++){
c[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=c[0];i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[0]>1 &&c[c[0]]==0)c[0]--;
string to="";
for(int i=c[0];i>=1;i--){
to+=char(c[i]+48);
}
return to;
}
string tostr(int a){
string s="";
while(a){
s+=char(a%10+48);
a/=10;
}
return s;
}
string fact_g(int n){
string sum="1";
for(int i=1;i<=n;i++){
sum=chen(sum,tostr(i));
}
return sum;
}
int t;
int main(){
cin>>t;
for(int i=1;i<=t;i++){
int n;
int k,cnt=0;
cin>>n>>k;
string s=fact_g(n);
// cout<<s<<endl;
char y=k+'0';
for(int i=0;i<s.size();i++){
if(s[i]==y)cnt++;
}
cout<<cnt<<endl;
}
return 0;
}