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