吉首大学2019年程序设计竞赛(重现赛)- A SARS病毒 (矩阵,欧拉降幂)

时间:2019-08-16
本文章向大家介绍吉首大学2019年程序设计竞赛(重现赛)- A SARS病毒 (矩阵,欧拉降幂),主要包括吉首大学2019年程序设计竞赛(重现赛)- A SARS病毒 (矩阵,欧拉降幂)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目链接:https://ac.nowcoder.com/acm/contest/992/A

题意:求出长度为n的字符串个数,字符串由A、C、G、T组成,其中A和C必须成对出现。

思路:我们规定:   f[n][0]--长度为n的合法字符串个数

        f[n][1]--长度为n的A为奇数个的字符串个数

        f[n][2]--长度为n的C为奇数个的字符串个数

        f[n][3]--长度为n的A、C均为奇数个的字符串个数

   那么有如下转移方程:

    

   根据转移方程构建矩阵:

    

   就可以通过矩阵快速幂求得了,n太大了,继续思考:

   

   然后齐次线性递推得到:f[n][0]=4n-1+2n-1,之后欧拉降幂即可。

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long LL;
const int MOD=1e9+7;
const int MOD1=1e9+6;

char s[100005];

LL qpow(LL a,LL b){
    LL ret=1;
    while(b){
        if(b&1) ret=ret*a%MOD;
        a=a*a%MOD;
        b>>=1;
    }
    return ret;
}

int main(){
    while(~scanf("%s",s)){
        LL tmp=0;
        for(int i=0;i<strlen(s);++i)
            tmp=(tmp*10+s[i]-'0')%MOD1;
        if(tmp>0) --tmp;
        else tmp=MOD1-1;
        tmp=qpow(2,tmp);
        printf("%lld\n",tmp*(tmp+1)%MOD);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/FrankChen831X/p/11365107.html