复数快速幂【模板】
实数范围内的乘法都是满足结合律的,
像 $1+\sqrt2,1+2i, 1+2\sqrt2 i$ 这些没有直接可用的乘法,但是相乘后形式保持不变,所以可以模拟乘法。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1e9 + 7; struct Complex{ //a+bi ll a, b; Complex(ll _a, ll _b) { a = _a; b = _b; } }; Complex mul(Complex x, Complex y, ll mod) { ll a = ((x.a*y.a - x.b*y.b)%mod + mod) % mod; //ll a = ((x.a*y.a - 5*x.b*y.b)%mod + mod) % mod; //a+b\sqrt5_i ll b = (x.a*y.b + x.b*y.a)%mod; return Complex(a, b); } Complex cpow(Complex x, ll n, ll mod) { Complex ret(1, 0); while(n) { if(n&1) ret = mul(ret, x, mod); x = mul(x, x, mod); n >>= 1; } return ret; } int main() { Complex a(1, 2); Complex ans = cpow(a, 3, 100); printf("%lld %lld\n", ans.a, ans.b); }
个性签名:时间会解决一切