吉首大學2019年程序設計競賽(重現賽)A:SARS病毒(找規律 or 推公式+歐拉降冪+快速冪)

【題解】

f[1]=2=1*2     f[2]=6=2*3      f[3]=20=4*5       f[4]=72=8*9 .....   f[n]=2^(n-1)*(2^(n-1)+1)

又n有10^100000,用歐拉降冪+快速冪處理一下就可以了。

推公式:

令f[n][1],f[n][2],f[n][3],f[n][4]分別表示長度爲n的字符串中A偶C偶、A奇C偶、A偶C奇、A奇C奇的情況數目。

我們可以得到:

f[n][1]=2*f[n-1][1]+f[n-1][2]+f[n-1][3];

f[n][2]=2*f[n-1][2]+f[n-1][1]+f[n-1][4];

f[n][3]=2*f[n-1][3]+f[n-1][1]+f[n-1][4];

f[n][4]=2*f[n-1][4]+f[n-1][2]+f[n-1][3];

f[n][2]=f[n][3] ,f[n][1]+f[n][4]=2*(f[n-1][1]+f[n-1][2]+f[n-1][3]+f[n-1][4])=f[n][2]+f[n][3] ,f[n][1]+f[n][2]+f[n][3]+f[n][4]=4^n

可以推出f[n][1]=2*4^(n-1)-2*f[n-1][1]

迭代得到F(n)=4^(n-1)+2^(n-1)

【代碼】

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
typedef long long ll;
char s[maxn];
ll quick_pow(ll a,ll b)
{
    ll ret=1;
    while(b){
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ret;
}
int main()
{
	while(~scanf("%s",s)){
        ll n=0;
        for(int i=0;i<strlen(s);i++){
            n=n*10+s[i]-'0';
            n=n%(mod-1);
        }
        ll ans=(quick_pow(2,n-1)*(quick_pow(2,n-1)+1)%mod)%mod;
        printf("%lld",ans);
	}
	return 0;
}

【題目】

SARS病毒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章