70分求调

P1591 阶乘数码

Iwara @ 2023-09-04 18:40:59

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll base=1e9,MAXN=1e5+5;
ll t;
ll n,a;
ll num[MAXN],len,ans;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>a;
        len=1;ans=0;
        memset(num,0,sizeof(num));
        num[1]=1;
        for(ll i=1;i<=n;i++){
            for(ll j=1;j<=len;j++)num[j]*=i;
            for(ll j=1;j<=len;j++)num[j+1]+=num[j]/base,num[j]%=base;
            if(num[len+1])len++;
            while(num[len]>=base)num[len+1]+=num[len]/base,num[len]%=base,len++;
        }
        for(ll i=len;i>=1;i--)while(num[i])ans+=(num[i]%10==a),num[i]/=10;
        cout<<ans<<endl;
    }
    return 0;
} 

退化到橙题不会写了


by DaShaber @ 2023-09-04 19:05:06

@iwara

中间某一段数字中如果有前导零会被程序忽略,会导致错误。

例如如果阶乘的结果是这个数:

11\,{\color{red}00000}1145\,141919810

那么红色的 0 不会被统计。


|