样例过,90,求

P1591 阶乘数码

Mei20 @ 2024-09-16 17:33:15

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct sj{
    int ord,a,n,sum;
};
bool cmp(sj a,sj b)
{
    return a.n<b.n;
}
bool comp(sj a,sj b)
{
    return a.ord<b.ord;
}
void mul(int *a,int b)
{
    int c[3001];
    memset(c,0,sizeof(c));
    for(int i=1;i<=a[0]+3;i++)
    {
        c[i]+=a[i]*b;
        if(c[i]>=10)
        {
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
    }
    a[0]+=3;
    while(c[a[0]]==0) a[0]--;
    for(int i=1;i<=a[0];i++)
    a[i]=c[i];
}
sj s[13];
int b[3001],t;
bool d;
int main()
{
    b[0]=1;b[1]=1;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>s[i].n>>s[i].a;
        s[i].ord=i;
    }
    sort(s+1,s+t+1,cmp);
    for(int i=1,j=1;i<=t;j++)
    {
        d=0;
        mul(b,j);
        if(s[i].n==j) {
            for(int k=b[0];k>=1;k--)
            if(b[k]==s[i].a) s[i].sum++;
            while(s[i+1].n==j&&i<=t){
                d=1;
                i++;
                for(int k=b[0];k>=1;k--)
                if(b[k]==s[i].a) s[i].sum++;
            }
            if(!d) i++;
        }           
    }
    sort(s+1,s+t+1,comp);
    for(int i=1;i<=t;i++)
    cout<<s[i].sum<<endl;
    return 0;
}

|