2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)

阿里巴巴协助征战SARS(困难)

  • 33.29%
  •  1000ms
  •  262144K
 

目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶、腺嘧啶均是成对出现的。这虽然是一个重大发现,但还不是该病毒的最主要特征,因为这个特征实在太弱了。

为了进一步搞清楚该病毒的特征,CN 疾病控制中心和阿里巴巴集团合作,用科技的力量和程序的思维来解决这个难题。现阿里巴巴特委派你成为 CN 疾病控制中心的 SARS 高级研究员,去研究在这个特征下,可能成为 SARS 病毒的 DNA 序列的个数。更精确地说,你需要统计所有满足下列条件的长度为 nn 的字符串的个数:

  1. 字符串仅由 A、T、C、G 组成
  2. A 出现偶数次(也可以不出现)
  3. C 出现偶数次(也可以不出现)

当 n=2n=2 时,所有满足条件的字符串有如下 66 个:

TT,TG,GT,GG,AA,CC。

注: 由于这个数可能非常庞大,你只需给出对 10^9 + 7109+7 取模的结果即可。

输入格式

输入文件给出了若干个 nn。最后以数字 00 结束。

输出格式

对于输入文件中的每一个 nn,输出满足条件的字符串的个数对 10^9 + 7109+7 取模的结果。

数据范围

n \le 10^{(10^5)}n10(105)

样例输入

1
2
3
100
0

样例输出

2
6
20
113046907




先用dfs跑一遍找到规律:2^n+4^n
然后就是大数取余的处理,字符串读入利用费马小定理+欧拉降幂。
形式类似HDU - 4704 sum 大数取余+欧拉降幂


#include<bits/stdc++.h>
#define MOD 1000000007
using namespace std;
typedef long long ll;

char s[100005];

ll qMod(ll a,ll b){
    ll ans=1;
    a%=MOD;
    while(b){
        if(b&1) ans=ans*a%MOD;
        b>>=1;
        a=a*a%MOD;
    }
    return ans;
}
int main()
{
    int n,len,i;
    while(scanf(" %s",s)&&s[0]!='0'){
        ll c=0;
        len=strlen(s);
        for(i=0;i<len;i++){
            int x=s[i]-'0';
            c=c*10+x;
            if(c>1000000006) c%=1000000006;
        }
        c=((c-1)%1000000006+1000000006)%1000000006;
        printf("%lld\n",(qMod(2,c)+qMod(4,c))%MOD);
    }
    return 0;
}

 

posted @ 2019-06-02 17:41  yzm10  阅读(292)  评论(0编辑  收藏  举报