题意:已知x+y=A x*y=B 求X^n+Y^n.

思路:设f(i)为X^n+Y^n 则f(n)=A*f(n-1)-B*f(n-2) 然后矩阵快速幂.

在矩阵乘法过程中有负数 在取余之前要先加上MOD.

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>

using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7;
const int MAXN=2;

struct Matrix{
    ll m[MAXN][MAXN];
    Matrix()
    {
        memset(m,0,sizeof(m));
    }
};

Matrix mtMul(Matrix A, Matrix B)
{
    int i,j,k;
    Matrix C;
    for(i = 0; i <MAXN; i ++)
        for(j = 0; j <MAXN; j ++)
            for(k = 0; k <MAXN; k ++)
                C.m[i][j]=(C.m[i][j]%MOD+((A.m[i][k]%MOD)*((B.m[k][j])%MOD))%MOD+MOD)%MOD;
    return C;
}

Matrix mtPow(Matrix A, ll k)
{
    if(k == 1) return A;
    Matrix B = mtPow(A, k / 2);
    if(k % 2 == 0)
        return mtMul(B, B);
    else
        return mtMul(mtMul(B, B), A);
}
int main()
{
    ll a,b,n;
    while(scanf("%lld%lld%lld",&a,&b,&n)!=EOF)
    {
        Matrix tmp;
        tmp.m[0][0]=a;
        tmp.m[0][1]=-b;
        tmp.m[1][0]=1;

        if(n==1)
            printf("%d\n",a);
        else
        {
            Matrix ans=mtPow(tmp,n-1);
            printf("%lld\n",(((ans.m[0][0]%MOD)*(a%MOD))%MOD+((ans.m[0][1]%MOD)*2)%MOD)%MOD);
        }
    }
    return 0;
}
View Code

优质内容筛选与推荐>>
1、AspNet控件开发(1)---入门介绍
2、Kubernetes的的 Persistent Volumes
3、IDEA和Eclipse快捷键比对
4、Android 开发中常用 ADB 命令总结
5、使用Jenkins && Sonar提升项目质量


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn