Recursive sequence——(hdu5950)_(矩阵快速幂)

题目:点击打开链接

题意:

F(1)=a,F(2)=b,F(N)=2F(N-2)+F(N-1)+N^4

给你N,a,b(N,a,b < 2^31)

求F(N)%2147493647

分析:

如果递推式是F(N)=2F(N-2)+F(N-1)就方便了许多,基本的矩阵快速幂

但是多了n^4;



这时,又产生了i^3,i^2,i这些新项需要我们计算



由推出的这些东西 我们就可以构造矩阵了

|1   2   1   4   6   4   1|     |f(n+1) |           | f(n+2) |
|1   0   0   0   0   0   0|     |f(n)   |              |f(n+1) |
|0   0   1   4   6   4   1|     |(n+1)^4|        |(n+2)^4|
|0   0   0   1   3   3   1|  *  |(n+1)^3|   = |(n+2)^3|
|0   0   0   0   1   2   1|     |(n+1)^2|         |(n+2)^2|
|0   0   0   0   0   1   1|     | n+1   |            | n+2   |
|0   0   0   0   0   0   1|     | 1     |               |  1    |

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll mod=2147493647;
int n,a,b;
struct matrix
{
    ll m[7][7];
    void init1()
    {
        m[0][0] = b,m[0][1] = 0,m[0][2] = 0,m[0][3] = 0,m[0][4] = 0,m[0][5] = 0,m[0][6] = 0;
        m[1][0] = a,m[1][1] = 0,m[1][2] = 0,m[1][3] = 0,m[1][4] = 0,m[1][5] = 0,m[1][6] = 0;
        m[2][0] = 16,m[2][1] = 0,m[2][2] = 0,m[2][3] = 0,m[2][4] = 0,m[2][5] = 0,m[2][6] = 0;
        m[3][0] = 8,m[3][1] = 0,m[3][2] = 0,m[3][3] = 0,m[3][4] = 0,m[3][5] = 0,m[3][6] = 0;
        m[4][0] = 4,m[4][1] = 0,m[4][2] = 0,m[4][3] = 0,m[4][4] = 0,m[4][5] = 0,m[4][6] = 0;
        m[5][0] = 2,m[5][1] = 0,m[5][2] = 0,m[5][3] = 0,m[5][4] = 0,m[5][5] = 0,m[5][6] = 0;
        m[6][0] = 1,m[6][1] = 0,m[6][2] = 0,m[6][3] = 0,m[6][4] = 0,m[6][5] = 0,m[6][6] = 0;
    }
    void init2()
    {
        m[0][0] = 1,m[0][1] = 2,m[0][2] = 1,m[0][3] = 4,m[0][4] = 6,m[0][5] = 4,m[0][6] = 1;
        m[1][0] = 1,m[1][1] = 0,m[1][2] = 0,m[1][3] = 0,m[1][4] = 0,m[1][5] = 0,m[1][6] = 0;
        m[2][0] = 0,m[2][1] = 0,m[2][2] = 1,m[2][3] = 4,m[2][4] = 6,m[2][5] = 4,m[2][6] = 1;
        m[3][0] = 0,m[3][1] = 0,m[3][2] = 0,m[3][3] = 1,m[3][4] = 3,m[3][5] = 3,m[3][6] = 1;
        m[4][0] = 0,m[4][1] = 0,m[4][2] = 0,m[4][3] = 0,m[4][4] = 1,m[4][5] = 2,m[4][6] = 1;
        m[5][0] = 0,m[5][1] = 0,m[5][2] = 0,m[5][3] = 0,m[5][4] = 0,m[5][5] = 1,m[5][6] = 1;
        m[6][0] = 0,m[6][1] = 0,m[6][2] = 0,m[6][3] = 0,m[6][4] = 0,m[6][5] = 0,m[6][6] = 1;
    }

};
matrix mul(matrix A,matrix B)
{
    matrix ans;
    memset(ans.m,0,sizeof(ans.m));
    for(int i=0; i<7; i++)
    {
        for(int j=0; j<7; j++)
        {
            for(int k=0; k<7; k++)
            {
                ans.m[i][j]=(ans.m[i][j]+A.m[i][k]*B.m[k][j]%mod)%mod;
            }
        }
    }
    return ans;
}
matrix pow(matrix A, ll p)
{
    matrix res;
    memset(res.m,0,sizeof(res.m));
    for(int i=0; i<7; i++)
        res.m[i][i]=1;
    while(p)
    {
        //cout<<"___"<<endl;
        if(p&1)
            res=mul(res,A);
        p>>=1;
        A=mul(A,A);
    }
    return res;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d%d%d",&n,&a,&b);
        if(n==1)
            printf("%lld\n",a%mod);
        else if(n==2)
            printf("%lld\n",b%mod);
        else
        {
            matrix ans,x;
            ans.init1();
            x.init2();
            x=pow(x,n-1);
            ans=mul(x,ans);
            printf("%lld\n",ans.m[1][0]);
        }

    }
    return 0;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
def repair_dna(self, dna_sequence, accessor, start_index, vt_check=None, max_consec = 4, max_error = 6): """ Repair the DNA sequence containing one (or more) errors. 默认有indel :return: repaired DNA sequence set and additional information. :rtype: list, at least have one item """ def recursive_repair(dna_sequence, location, start_index, consec, error): # recursion stop if consec > max_consec or error > max_error: return [] elif location == len(dna_sequence): return [(dna_sequence, consec, error)] # get variables results = [] nucleotides = "ACGT" used_indices, current_nucleotide = np.where(accessor[start_index] >= 0)[0], dna_sequence[location] used_nucleotides = [nucleotides[used_index] for used_index in used_indices] # match if current_nucleotide in used_nucleotides: results.extend(recursive_repair(dna_sequence, location + 1, accessor[start_index][nucleotides.index(current_nucleotide)]), 0, error) # substitution for nucleotide in used_nucleotides: if nucleotide != current_nucleotide: results.extend(recursive_repair(dna_sequence, location + 1, accessor[start_index][nucleotides.index(nucleotide)]), consec + 1, error + 1) # insertion results.extend(recursive_repair(dna_sequence[:location] + dna_sequence[location + 1:], location, accessor[start_index][nucleotides.index(nucleotide)]), consec + 1, error + 1) # deletion for nucleotide in used_nucleotides: results.extend(recursive_repair(dna_sequence[:location] + nucleotide + dna_sequence[location + 1:], location + 1, accessor[start_index][nucleotides.index(nucleotide)]), consec + 1, error + 1) return results
最新发布
07-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值