zoukankan      html  css  js  c++  java
  • 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
    ",(qMod(2,c)+qMod(4,c))%MOD);
        }
        return 0;
    }
  • 相关阅读:
    自我介绍
    工作流
    spring框架
    关于建立内部会议讨论规范的想法
    论文第3章:移动绘图平台的架构设计
    迭代器、推导式、函数式编程学习笔记
    Python装饰器学习(九步入门)
    Inkpad绘图原理浅析
    从零开始创建一个插件
    Entity Framework的启动速度优化
  • 原文地址:https://www.cnblogs.com/yzm10/p/10963618.html
Copyright © 2011-2022 走看看