刷题笔记–小强爱数学–阿里笔试题
小强发现当已知xy=B以及x+y = A时,能很轻易的算出x^2 +y^2的值。但小强想请你在已知A 和B的情况下,计算出x^n+ y^n的值。因为这个结果可能很大,所以所有的运算都在模1e9+7下进行.
//记 R(n) = x^n + y^n, a = x + y, b = x * y
//递推公式:R(n) = a * R(n-1) - b * R(n-2)
#include <bits/stdc++.h>
using namespace std;
const int M= 1e9+7;
long long cal( long long a, long long b, long long n)
{
if(n == 1)//n=1时直接返回a%M即可
return a % M;
if(n == 2)//n=2时返回a^2-2b,记得都要%M
return ((a * a) % M - (2 * b) % M) % M;
long long res;
long long c_2 = a % M, c_1 = ((a * a) % M - (2 * b) % M) % M;
//c_1代表R(n-1),c_2代表R(n-2),并不断随着n更新
for(int i = 3; i <= n; i++)//通式里有n-2,因此此处从3开始
{
res = ((a * c_1 % M - b * c_2 % M)%M +M)% M;
//此处%M+M的操作属实没有看懂,有大神明白的话,还望赐教
c_2 = c_1;//计算下一个res时,此时的c_2更新为c_1
c_1 = res;//计算下一个res时,本轮计算得出的res成为R(n-1),即c_1应更新为res
}
return res;
}
int main()
{
int T;
cin >> T;
vector<long long> res(T);
for(int i = 0; i < T; i++)
{
long long a, b, n;
cin >> a >> b >> n;
res[i] = cal(a, b, n);
}
for(int i = 0; i < T; i++)
cout << res[i] << endl;
return 0;
}
知识点补充:
(a+b)^n(n=0,1,2,3,…)
其按n的值逐个展开后,式中的系数是“杨辉三角”,a是升幂,b是降幂。