POJ

https://cn.vjudge.net/problem/POJ-1423

考虑到低位的影响应该几乎没有,用long double暴力存就可以了。
预处理一波直接输出。

//#include <bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;

const int MAXM=1e5,MAXN=1e7;
long double val[MAXM+1];
int p10[MAXM+1];

void init(){
    val[0]=1.0;
    long double cur=1.0;
    int cntp10=0;
    for(int i=1;i<=MAXN;++i){
        cur*=i;
        if(i%100==0){
            val[i/100]=cur;
            p10[i/100]=cntp10;
        }
        if(cur>=1e7){
            cur/=1e7;
            cntp10+=7;
        }
    }
}

int calc(int n){
    int rc=n%100;
    int r=n/100*100+1;
    long double cur=1.0;
    int cntp10=0;
    for(int i=1;i<=rc;++i){
        cur*=r;
        ++r;
        if(cur>=1e7){
            cur/=1e7;
            cntp10+=7;
        }
    }
    cur*=val[n/100];
    cntp10+=p10[n/100];
    while(cur>=1.0){
        cur/=10.0;
        cntp10++;
    }
    return cntp10;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    init();
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        printf("%d
",calc(n));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Yinku/p/11235342.html