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();
}

浙公网安备 33010602011771号