首先发现很大,所以可以用字符串读进来。

读进来先别转换成数字,注意是连乘,但最后又是要,所以可以想出在时答案一定为0

对于,发现可以先预处理出答案,左边要乘上所有小于等于的数,所有可以先预处理出前缀和,然后再预处理出所有的乘上它这一位的前缀和

最后还有个连乘,就是把每一位的乘上上一步做完的东西,所以你发现这玩意也可以预处理,整一个前缀乘得出来的就是答案

string s;
#define mod 199999
ll sum[mod+1],cnt[mod+1],num[mod+1],res[mod+1],inv[mod+1];
int main(){
    for(int i=1;i<=mod;i++)sum[i]=(sum[i-1]+i)%mod;
    for(int i=1;i<=mod;i++)cnt[i]=(sum[i]*i)%mod;
    for(int i=1;i<=mod;i++)num[i]=(num[i-1]+cnt[i])%mod;
    res[0]=1;
    for(int i=1;i<=mod;i++)res[i]=((res[i-1]*num[i])%mod*i)%mod;
    //↑预处理部分
    ll q;cin>>q;
    while(q--){
        cin>>s;
        if(s.size()>6||(s.size()==6&&(s>="199999"))){  //注意特判
            cout<<0<<endl;
            continue;
        }
        ll n=0,p=-1;
        for(int i=s.size()-1;i>=0;i--){
            p++;
            n=n+powmod(10,p,mod)*(s[i]-'0');
        }
        cout<<res[n]<<endl;
    }cout<<endl;
    return 0;
}

可能我是最劣解吧,聚聚们都吊打我