求组大佬!!!!

P1591 阶乘数码

Galaxy6 @ 2021-07-29 20:09:07

#include<bits/stdc++.h>
#define maxn 1000
using namespace std;
int t;
vector<int>v;
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<=len;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        for(int i=len;i>0;i--)
        {
            if(a[i]==0) len--;
            else break;
        }
    }
    void print()
    {
        for(int i=len;i>0;i--) printf("%d",a[i]);
        printf("\n");
    }
};
bigint operator*(bigint b1,bigint b2)
{
    bigint c;
    for(int i=1;i<=b1.len;i++)
        for(int j=1;j<=b2.len;j++)
            c[i+j-1]+=b1[i]*b2[j];
    c.flatten(b1.len+b2.len);
    return c;
}
int func(int n,int a)
{
    bigint b(n);
    for(int i=n-1;i>0;i--)
    {
        bigint temp(i);
        b=b*temp;
    }
    //b.print();
    //cout<<b.len<<endl;
    int cnt=0;
    for(int i=1;i<=b.len;i++)
    {
        if(b[i]==a) cnt++;
    }
    return cnt;
}
int main()
{
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        int n,a;
        scanf("%d%d",&n,&a);
        int ans=func(n,a);
        v.push_back(ans);
    }
    for(int i=0;i<v.size();i++) printf("%d\n",v[i]);
    return 0;
}

|