【題解】
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;
}
【題目】