除了测试点7以外全过,大佬救救

P1591 阶乘数码

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

也是挂在这里,感谢!


|