快速幂取模
long long quick_mod(long long a,long long b,long long Mod)
{
long long ans = 1;
a %= Mod; //对刚进来的a进行取模运算,避免后面第一次求平方运算溢出
while(b)
{
if(b&1) //对二进制下的 b 进行按位与1运算,求二进制下 b 的最低位是否为1
ans = ans * a % Mod; //对结果进行保存
b>>=1; //二进制下的 b 右移一位,相当于十进制下的 b 除以2
a = a * a % Mod;
}
return ans % Mod;
}
指定模数 多次查询预处理优化快速幂
const int Mod = 998244352, Sqrt = 31596;
long long val[32000], van[32000], vd, qn;
int main() {
long long q;
scanf("%lld%lld", &vd, &qn);
val[0] = 1;
val[1] = vd % Mod;
for (int i = 2; i <= Sqrt; i++) val[i] = val[i - 1] * vd % Mod; // cout<<val[i]<<" ";
van[0] = 1;
van[1] = val[Sqrt];
for (int i = 2; i <= Sqrt; i++) van[i] = van[i - 1] * val[Sqrt] % Mod;
for (int i = 1; i <= qn; i++) {
scanf("%lld", &q);
// cout<<q%Sqrt<<" "<<q/Sqrt<<endl;
// cout<<val[q%Sqrt]<<" "<<van[q/Sqrt]<<endl;
printf("%lld ", val[q % Sqrt] * van[q / Sqrt] % Mod);
}
puts("");
}
https://www.luogu.com.cn/problem/P1016
https://blog.csdn.net/earnmoney/article/details/78085637

浙公网安备 33010602011771号