P1591 阶乘数码 - 题解

P1591 阶乘数码

题目描述

求 $n!$ 中某个数码出现的次数。

输入格式

第一行为 $t(t \leq 10)$,表示数据组数。接下来 $t$ 行,每行一个正整数 $n(n \leq 1000)$ 和数码 $a$。

输出格式

对于每组数据,输出一个整数,表示 $n!$ 中 $a$ 出现的次数。

输入输出样例 #1

输入 #1

2
5 2
7 0

输出 #1

1
2

题解代码

#include <iostream>
#include <cstring>
#include <iomanip>
#include <string>
#include <algorithm>
using namespace std;
string mul(string a,string b){
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    int alen=a.length(),blen = b.length();
    for(int i=0;i<alen;i++)a[i]-='0';
    for(int j=0;j<blen;j++)b[j]-='0';
    int c[20003]={'\0'};
    //注意要用int,而不是char,因为在数字小的时候不会爆掉,数字大的话,char类型可能会爆。
    for(int i=0;i<alen;i++){
        for(int j=0;j<blen;j++){
            c[i+j]+=a[i]*b[j];
            c[i+j+1]+=c[i+j]/10;
            c[i+j]%=10;
        }
    }
    int len = alen+blen+1;
    reverse(c,c+len);
    stringstream ss;
    for(int i=0;i<len;i++)c[i]+='0';
    for(int i=0,flag=1;i<len;i++){
        if(flag&&c[i]!='0'){
            flag=0;
        }
        if(flag)continue;
        ss<<c[i];
    }
    return ss.str().length()==0?"0":ss.str();
}
int t;
int a,b;
void start(){
    cin>>t;
    while(t--){
        int ans=0;
        cin>>a>>b;
        stringstream ss;
        ss<<a;
        stringstream c;c.str(ss.str());
        for(int i=a-1;i>1;i--){
            ss.str("");
            ss<<i;
            c.str(mul(c.str(),ss.str()));
        }
        for(int i=0;i<c.str().length();i++){
            // cout<<c[i];
            if(c.str()[i]==b+'0'){
                ans++;
            }
        }
        cout<<ans<<endl;
    }
}
int main(){
    start();
}

posted @ 2026-11-01 10:23  ysMip  阅读(5)  评论(0)    收藏  举报