问题标题: 酷町堂:3473 阶乘数码

0
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;
}

 


0
0
我要回答