kdurnd @ 2023-12-06 22:59:23
#include<iostream>
#include<utility>
#define maxn 2600
using namespace std;
pair<int, int> times[12]; //储存每一次的阶乘数 和 数码
int arr[maxn] = { 1 };//计算阶乘
int temp[maxn];//辅助计算阶乘
int ans[12];//存储每一次询问的答案
short T[1005];//T[i] = a 表示第a次询问时的第一个数
int Max;//需要求到的最大阶乘数
void mul(int a[], int x)//高精乘
{
for (int i = 0; i < maxn; i++)
{
a[i] *= x;
if (i)
{
a[i] += temp[i - 1];
}
temp[i] = a[i] / 10;
a[i] %= 10;
}
}
void jc(int n)//阶乘
{
for (int i = 1; i <= n; i++)
{
mul(arr, i);
if (T[i])
{
int j = maxn;
while (!arr[--j]);
for (; j >= 0; j--)
{
if (arr[j] == times[T[i]].second)
ans[T[i]]++;
}
}
}
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> times[i].first >> times[i].second;
T[times[i].first] = i;
Max = Max > times[i].first ? Max : times[i].first;
}
jc(Max);
for (int i = 1; i <= n; i++)
cout << ans[i] << endl;
return 0;
}
by kdurnd @ 2023-12-08 21:45:59
找到问题了,测试7有两次询问的是同一个数的阶乘,我的方法会导致第二次的覆盖了第一次, 因此只得到后面的答案。也欢迎大家参考本人的做法,感觉比大多数题解的做法应该会快很多
by GaoF05 @ 2024-11-25 14:34:35
也是挂在这里,感谢!