help

P1591 阶乘数码

chris731 @ 2023-12-28 22:22:27

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int c[4005005];
int o[4005005];
int main(){
    ios::sync_with_stdio(0);
    //freopen("xxx.in", "r", stdin);
    //freopen("xxx.out", "w", stdout);
    int q;
    cin>>q;
    while(q--){
        memset(c,0,sizeof(c));
        int n,t;
        ll ans=0;
        cin>>n>>t;
        c[1]=1;
        int m=1,k=1;
        for(int i=2;i<=n;i++){
            int x=0;
            for(int j=1;j<=k;j++){
                c[j]*=i;
                c[j]+=x;
                x=0;
                if(c[j]>9){
                    if(j==k){
                        m++;
                    }
                    x=c[j]/10;
                    c[j]%=10;
                }
            }
            if(x>0){
                c[m]=x;
                x=0;
            }
            k=m;
            if(c[m]>9){
                m++;
                c[m+1]=c[m]/10;
                c[m]%=10;
            }
            /*for(int i=m;i>=1;i--){
                cout<<c[i];
            }
            cout<<endl;*/

        }
        while(c[m]==0&&m!=1){
            m--;
        }
        for(int i=m;i>=1;i--){
            cout<<c[i];
        }
        cout<<endl;
        for(int i=m;i>=1;i--){
            if(c[i]==t){
                ans++;
                //cout<<c[i]<<" "<<i;
            }
        }
        cout<<ans<<endl;    
    }
    return 0;
}

by _buzhidao_ @ 2023-12-28 22:42:26

@chris731

#include<bits/stdc++.h>
using namespace std;
const int _long=10030;//10^_long
void input(int x[]){
    string s;cin>>s;
    memset(x,0,sizeof(x));
    x[0]=s.size();//数组格式:长度+内容 
    for(int i=0;i<x[0];i++){
        x[x[0]-i]=s[i]-48;//惨痛的教训 
    }
} 
void print(int x[]){
    for(int i=x[0];i>0;i--) cout<<x[i];
    cout<<endl;
}
void mem_set(int x[]){
    for(int i=0;i<=_long;i++) x[i]=0;//不严谨 
}

void cheng(int x[],int y[],int z[]){
    mem_set(z);
    z[0]=x[0]+y[0];int k;
    for(int i=1;i<=x[0];i++){
        k=0;
        for(int j=1;j<=y[0];j++){
            z[i+j-1]+=x[i]*y[j]+k;
            k=z[i+j-1]/10;
            z[i+j-1]%=10;
        }
        z[i+y[0]]+=k;
    }
    while(z[z[0]]==0&&z[0]>1) z[0]--;
}
void str_int(int x,int y[]){
    int z=x,cnt=0;
    y[0]=cnt;
    while(z!=0){
        y[cnt+1]=z%10;
        z/=10;cnt++;
    }
    y[0]=cnt;
    //print(y); 
}
int main(){
    int a[_long+1],b[_long+1],c[2*_long+1];
    int n,s,l,cnt;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s>>l;
        mem_set(a);
        a[0]=1;a[1]=1;
        cnt=0;
        for(int j=1;j<=s;j++){
            str_int(j,b);
            cheng(a,b,c);
            for(int k=0;k<=c[0];k++){
                a[k]=c[k];
            }
        }
        for(int i=1;i<=c[0];i++){
            if(c[i]==l) cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

|