2409: 【例】【普及-】【P1591】阶乘数码
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:9
解决:5
题目描述
求 中某个数码出现的次数。
输入
第一行为 ,表示数据组数。接下来 行,每行一个正整数 和数码 。
输出
对于每组数据,输出一个整数,表示 中 出现的次数。
样例输入 复制
2
5 2
7 0
样例输出 复制
1
2
提示
#include<bits/stdc++.h>
using namespace std;
int a[5000];
int main() {
int t;
cin >> t;
while (t--) {
for (int i = 1; i <= 1001; i++)
a[i] = 0; //将数组清零。
a[1] = 1; //必须设为1。不能为0,不然怎么乘都是0。
int n, i, j, k, m;
int p = 1, jw = 0; //p代表位数,jw代表进位。
scanf("%d%d", & n, & m);
for (i = 2; i <= n; i++) //从2开始,反正任何数乘1还等于它本身。
{
jw = 0;
for (j = 1; j <= p; j++) //高精度*单精度。
{
a[j] = a[j] * i + jw; //高精度*单精度+进位。
jw = a[j] / 10; //设置进位。
a[j] = a[j] % 10;
}
while (jw > 0) //如果还有进位,处理进位。
{
a[j] = jw % 10;
jw /= 10;
j++;
}
p = j - 1;
}
int ans = 0;
for (i = p; i >= 1; i--) //搜索n!里有几个指定数字。
{
if (a[i] == m)
ans++;
}
cout << ans << endl; //输出。
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define maxn 5000
struct Bigint {
int len, a[maxn];
Bigint(int x = 0) {
memset(a, 0, sizeof(a));
for (len = 1; x; len++)
a[len] = x % 10, x /= 10;
--len;
}
int & operator[](int i) {
return a[i];
}
void flatten(int L) {
len = L;
for (int i = 1; i <= L; ++i) {
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
for (; !a[len];)
len--;
}
void print() {
for (int i = max(len, 1); i >= 1; --i)
printf("%d", a[i]);
}
};
Bigint operator + (Bigint & a, Bigint & b) {
Bigint c;
int len = max(a.len, b.len);
for (int i = 1; i <= len; ++i)
c[i] += a[i] + b[i];
c.flatten(len + 1);
return c;
}
Bigint operator * (Bigint & a, int b) {
Bigint c;
int len = a.len;
for (int i = 1; i <= len; ++i)
c[i] = a[i] * b;
c.flatten(len + 11);
return c;
}
int main() {
int t;
cin >> t;
while (t--) {
Bigint fac(1);
int i, n, m;
cin >> n >> m;
for (i = 1; i <= n; ++i) {
fac = fac * i;
}
int ans = 0;
for (i = fac.len; i >= 1; i--) //搜索n!里有几个指定数字。
{
if (fac[i] == m)
ans++;
}
cout << ans << endl; //输出。
}
return 0;
}