埃匹希斯水晶
题目描述
大家都知道,卡德加是个神奇的法师。 有一天,他发现了一种可以作用在埃匹希斯水晶上的魔法:在左右两个祭坛上放一定量的水晶,然后施放一个法术,左边一堆的水晶数量会变成原来两个祭坛上水晶之和,右边一堆会变成两个祭坛上水晶数量之差。
卡德加现在有两堆水晶,分别有 A 个和 B 个。他打算集中精神连续 释放 N次法术,但不知道最后能拿到多少水晶,于是他找到了要塞指挥官(就是你了)。
输入格式
三个整数 A, B, N ,表?祭坛上刚开始的水晶数,和法术的释放次数。
输出格式
两个数,祭坛上最后的水晶数。输出模 (10e8 + 7)。
样例数据
input
1 2 3
output
6 2
我们从代数上考虑:
初始数字为 a , b a,b a,b,假设 a > b a>b a>b
第一次: a + b a+b a+b a − b a-b a−b
第二次: 2 a 2a 2a 2 b 2b 2b
第三次: 2 a + 2 b 2a+2b 2a+2b 2 a − 2 b 2a-2b 2a−2b
第四次: 4 a 4a 4a 4 b 4b 4b
第n次(偶数): 2 n / 2 ∗ a 2^{n/2}*a 2n/2∗a 2 n / 2 ∗ b 2^{n/2}*b 2n/2∗b
(奇数): 2 n / 2 ∗ ( a + b ) 2^{n/2}*(a+b) 2n/2∗(a+b) 2 n / 2 ∗ ( a + b ) 2^{n/2}*(a+b) 2n/2∗(a+b)
因为乘方数较大,我们需要使用快速幂。
因为乘起来的数会爆longlong,我们需要使用快速乘。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a,b,n;
LL const P=10e8+7;
LL mul(LL a,LL b)
{
LL res=0;
while (b>0)
{
if (b&1) res&