2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)
阿里巴巴协助征战SARS(困难)
- 33.29%
目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶、腺嘧啶均是成对出现的。这虽然是一个重大发现,但还不是该病毒的最主要特征,因为这个特征实在太弱了。
为了进一步搞清楚该病毒的特征,CN 疾病控制中心和阿里巴巴集团合作,用科技的力量和程序的思维来解决这个难题。现阿里巴巴特委派你成为 CN 疾病控制中心的 SARS 高级研究员,去研究在这个特征下,可能成为 SARS 病毒的 DNA 序列的个数。更精确地说,你需要统计所有满足下列条件的长度为 nn 的字符串的个数:
- 字符串仅由 A、T、C、G 组成
- A 出现偶数次(也可以不出现)
- 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)}n≤10(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; }
博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10