1_998244353:
由于\(998244353\)是十分常见的模数,所以可以猜想到取模。
\(1,19,361....\)是\(19^x\)。
前两个点可以直接用快速幂计算。
第三个点由于数比较大,所以使用euler定理,把幂次模\(998244352\)后快速幂。
namespace s1{ int mo=998244353; int qp(int x,int y){ int r=1; for(;y;y>>=1,x=x*x%mo) if(y&1) r=r*x%mo; return r; } int rd(){ char c=getchar(); int x=0; while(!isdigit(c)) c=getchar(); while(isdigit(c)){ x=(x*10%(mo-1)+c-'0')%(mo-1); c=getchar(); } return x; } void main(){ int T; scanf("%lld",&T); while(T--){ int x=rd(); printf("%lld\n",qp(19,x)); } } };
1_?:
发现前3个数是\(1,19,361\),而且是联考年份的尾数,所以考虑快速幂。
由于取模的性质,所以每个数都会小于模数,可以从答案文件最大数开始暴力从小到大枚举。
在验证时只需要验证第一个数即可。
发现是\(1145141\)
namespace s2{ int mo=1145141; int qp(int x,int y){ int r=1; for(;y;y>>=1,x=x*x%mo) if(y&1) r=r*x%mo; return r; } int rd(){ char c=getchar(); int x=0; while(!isdigit(c)) c=getchar(); while(isdigit(c)){ x=(x*10%(mo-1)+c-'0')%(mo-1); c=getchar(); } return x; } void main(){ int T; scanf("%lld",&T); while(T--){ int x=rd(); printf("%lld\n",qp(19,x)); } } };