二分求幂,取模性质

2019-04-13 20:41发布

http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=5712 需要注意的有: 1.数很大,用long long存 2.二分求幂,power(a,n)复杂度log(n) 3.充分利用模的性质,例如power(a,b)%MOD=power(a%MOD,b) 4.在求power(a,b)的过程中,只要累计的结果ans或乘子a任何一个超过了MOD,马上取模把数降下来 5.输出结果时嵌套取模,保证在MOD内 例如:(a+(k-1)*d)%MOD =(a%MOD+((k-1)*d)%MOD)%MOD =(a%MOD+(((k-1)%MOD)*(d%MOD))%MOD)%MOD cpp代码: #include #define MOD 200907 using namespace std; long long power(long long a,long long b){ long long ans=1; a%=MOD; while(b!=0){ if(b%2) ans=(ans*a)%MOD; b/=2; a=(a*a)%MOD; } return ans; } int main() { long long k,a,b,c; int n; cin>>n; while (n--){ cin>>a>>b>>c>>k; if (a+c==2*b){ long long d = b-a; cout<<(a%MOD+(((k-1)%MOD)*(d%MOD))%MOD)%MOD<