2021-07-02

这篇博客探讨了如何在已知x+y=A和xy=B的情况下,利用递推公式计算x^n+y^n的值。文章通过C++代码展示了递推公式R(n)=a*R(n-1)-b*R(n-2)的应用,并指出在模1e9+7下进行计算。博主还补充了二项式展开的知识点,帮助理解计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刷题笔记–小强爱数学–阿里笔试题

题目链接:https://www.nowcoder.com/questionTerminal/3b6dc1447d6d4ac4b9c2d45f1d4637ea?orderByHotValue=0&mutiTagIds=235_134&page=1

小强发现当已知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)
(a+b)^n(n=0,1,2,3,…)
其按n的值逐个展开后,式中的系数是“杨辉三角”,a是升幂,b是降幂。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodePlayer大旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值