首先发现很大,所以可以用字符串读进来。
读进来先别转换成数字,注意是连乘,但最后又是要
,所以可以想出在
时答案一定为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;
} 可能我是最劣解吧,聚聚们都吊打我

京公网安备 11010502036488号