如果某题的整数答案过大,超出了一般类型的表示范围。而良心出题人又不打算考察你高精度整数的运用,他们会要求你输出答案对p取模的结果。p的常见取值有998,244,353和109+7等。
给定一个整数p,任意一个整数a,一定存在等式a = kp + r,其中k, r是整数,且 0 ≤ r < p。
称k为n除以p的商,r为n除以p的余数。r就是a对p取模的结果,记做amodp。
对于正整数p和正整数a,C++定义的%运算:a%p=amodp,%和mod的优先级与乘除运算同级。
需要注意在a为负数时,C++的%运算的答案实际上为 −(amodp), 而不是我们期望的amodp。一个通用的取模写法是(a%mod+mod)%mod。
模运算有着很好的性质:
(a+b)modp(a−b)modp(a∗b)modp(ab)modp=(amodp+bmodp)modp=(amodp−bmodp)modp=(amodp)∗(bmodp)modp=(amodp)bmodp
在要求答案对p取模的时候,你应当利用模运算的性质,最好在每次运算之后进行取模,以避免答案超出变量所能表示的范围上限。同时,负数取模需要额外注意。
给定一个长度为n,首项为1,公比为q的等比数列,求其模p意义下的和。