全wa ,求助!!

P1591 阶乘数码

QingQiu1 @ 2022-12-07 16:26:00


#include <iostream>
using namespace std;
int t,n,a;
int b[1001];
long long wei,jg;
int main()
{   
    cin>>t;
    while(t)
    {   
        int j,i;
        jg=0;
        wei=0;
        cin>>n>>a;
        for(i=0;i<=1000;i++) b[i]=0;
        b[1000]=1;
        int jw=0;

        for( j=2;j<=n;j++)
        {
            for( i=1000;i>=0;i--)
            {
                b[i]=b[i]*j+jw;
                jw=b[i]/10;
                b[i]%=10;
            }
            while(jw>0)
            {
                b[i]=jw%10;
                jw/=10;
                i--;
            }
        }
        for( wei=0;wei<=1000;wei++)
        {
            if(b[wei]!=0) break;
        }
        for( i=wei;i<=1000;i++)
        {
            if(b[i]==a)jg++;
        }
        cout<<jg<<endl;
        t--;
    }
    return 0;
}

by Libingyue2011 @ 2023-01-28 14:33:49

高精度结构体 + 重载运算符 + STL排序函数sort + STL二分查找函数upper_bound & lower_bound 快速统计排完序的数列的某个元素个数 , 代码如下:


#include<iostream>//C++风格
#include<cstdio>//C语言风格
#include<algorthm>//STL函数库
using namespace std;
struct bigint{//高精结构体 
    int a[3000],len;
    int &operator [] (int i){
        return a[i];
    }
    bigint(int x=0){
        memset(a,0,sizeof a);
        for(len=1;x;len++){
            a[len]=x%10,x/=10;
        }
        len--;
    }
    void bigset(int x){
        memset(a,0,sizeof a);
        for(len=1;x;len++){
            a[len]=x%10,x/=10;
        }
        len--;
    }
    void f(int l){
        len=l;
        for(int i=1;i<=len;i++){
            a[i+1]+=a[i]/10,a[i]%=10;
        }
        for( ;!a[len]; ){
            len--;
        }
    }
};
bigint operator * (bigint a,int b){
    bigint c;
    for(int i=1;i<=a.len;i++){
        c[i]=a[i]*b;
    }
    c.f(a.len+11);
    return c;
}
void print(bigint x){
    for(int i=x.len;i>=1;i--){
        cout<<x[i];
    }
    printf("\n");
}
int jctj(bigint a,int t){
    sort(a.a+1,a.a+a.len+1);//二分统计 
    int ans=upper_bound(a.a+1,a.a+a.len+1,t)-lower_bound(a.a+1,a.a+a.len+1,t);
    return ans;
} 
int t;
bigint ans(1);
int main() {
    scanf("%d",&t);//输入
    for(int i=1;i<=t;i++){
        int n,p;
        cin>>n>>p;
        ans.bigset(1);
        for(int j=2;j<=n;j++){
            ans=ans*j;
        }
        cout<<jctj(ans,p)<<"\n";
    }
    return 0;
}

|