递推题:我是用高中那种树状图来进行模拟,递推。根节点必定是A,叶子必定是A,层数就是n,第n层与第n-1层有很大的关系,比如:第1层为0(根节点算第0层),第2层为2,第1层节点数为2^1……第3层为2,第2层节点数为2^2……第4层为6,第3层节点数为2^3……第5层为10,第4层节点数为2^4……依次类推!!!
再次回顾此题,发现可以预处理一下,然后数学归纳法,得出公式:F[i]=2*F[i-2]+F[i-1]……
import java.util.*;
import java.math.BigInteger;
public class Main {
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
BigInteger[] ans=new BigInteger[1001];
ans[1]=BigInteger.ZERO;
BigInteger k=new BigInteger("2");
BigInteger mo=new BigInteger("10000");
ans[2]=k;
for(int i=3;i<=1000;i++) {
BigInteger p=ans[i-2].multiply(k);
p=p.add(ans[i-1]);
ans[i]=p;
}
while(cin.hasNext()) {
int n=cin.nextInt();
if(n==0) break;
System.out.println(ans[n].mod(mo));
}
}
}
#include<bits/stdc++.h>
using namespace std;
#define mod 30000;
int f(int m,int n)
{
if(n==0) return 1;
int t=f(m,n/2);
int ans=(long long)t*t%mod;
if(n&1) ans=(long long)ans*m%mod;
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
if(n==1) printf("0\n");
else if(n<=3) printf("2\n");
else
{
if(n&1)
{
n=(n-1)/2;
int m=2*n+1;
int ans=f(2,m)-2;
printf("%d\n",ans/3);
}
else
{
n=(n-2)/2;
int m=2*n+2;
int ans=f(2,m)-4;
printf("%d\n",ans/3+2);
}
}
}
return 0;
}