/* -*- coding: utf-8 -*- * * 1448.cc: No.1448 和差算 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MOD = 1000000007; /* typedef */ typedef long long ll; /* global variables */ int as[2], bs[2]; ll ps[4]; /* subroutines */ int powmod(int a, ll n) { // a^n % MOD int pm = 1; while (n > 0) { if (n & 1) pm = (ll)pm * a % MOD; a = (ll)a * a % MOD; n >>= 1; } return pm; } /* main */ int main() { ll n; scanf("%d%d%d%d%lld", as, as + 1, bs, bs + 1, &n); /* a{i+1}=ai-bi, b{i+1}=ai+bi -> a{i+1}+b{i+1}=(ai-bi)+(ai+bi)=2ai a{i+1}-b{i+1}=(ai-bi)-(ai+bi)=-2bi a{i+2}+b{i+2}=2a{i+1}=2(ai-bi) a{i+2}-b{i+2}=-2b{i+1}=-2(ai+bi) a{i+3}+b{i+3}=2(a{i+1}-b{i+1})=2((ai-bi)-(ai+bi))=-4bi a{i+3}-b{i+3}=-2(a{i+1}+b{i+1})=-2((ai-bi)+(ai-bi))=-4ai a{i+4}+b{i+4}=-4b{i+1}=-4(ai+bi) a{i+4}-b{i+4}=-4a{i+1}=-4(ai-bi) -> let n=4m+k (0<=k<4) an+bn = (-4)^m*(ak+bk) */ int k = n & 3; ll m = n >> 2; for (int bits = 0; bits < 4; bits++) { ll ai = as[bits >> 1], bi = bs[bits & 1]; for (int i = 0; i < k; i++) { ll a1 = ai - bi, b1 = ai + bi; ai = a1, bi = b1; } ps[bits] = ai + bi; } sort(ps, ps + 4); int ab = ((m & 1) ? ps[0] : ps[3]) % MOD; if (ab < 0) ab += MOD; int e = powmod(4, m); int x = (ll)((m & 1) ? (MOD - e) : e) * ab % MOD; printf("%d\n", x); return 0; }