一年后 C1 1
两年后 C1 (B1) 2
三年后 C1 (B1 B2) 3
四年后 C1 (B1 B2 B3) B1(D1) 5(重复的不算)
五年后 C1(B1 B2 B3 B4) B1(D1 D2) B2(E1) 8
六年后 C1(B1 B2 B3 B4 B5) B1(D1 D2 D3) B2(E1 E2) B3(F1) D1(G1) 13
第一反应,斐波那契数列(但是超时)
public static int cow(int n)
{
if(n==1) return 1;
if(n==2) return 2;
return cow(n-1)+cow(n-2);
}
public static void main(String[]args) {
Scanner input=new Scanner(System.in);
int t=Integer.parseInt(input.nextLine());
while(t-->0) {
int n=Integer.parseInt(input.nextLine());
int res=cow(n);
System.out.print(res+"\n");
}
}
然后想到用快速幂方法
private static int MOD_NUM=1000000007;
public static void main(String[]args) {
Scanner input=new Scanner(System.in);
int t=Integer.parseInt(input.nextLine());
while(t-->0) {
long n=Long.parseLong(input.nextLine());
long res=pow(n);
System.out.print(res%MOD_NUM+"\n");
}
}
private static long pow(long n) {
long[][]multiplier= {{1,1},{1,0}};
long [][]ans= {{1,0},{0,1}};
while(n>0) {
if((n&1)==1) {
ans=mutiply(ans,multiplier);
}
n>>=1;
multiplier=mutiply(multiplier,multiplier);
}
return ans[0][0];
}
private static long[][]mutiply(long[][]a,long [][]b){
int n=a.length;
long[][]ans=new long[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
for(int k=0;k<n;k++) {
ans[i][j]+=a[i][k]*b[k][j]%MOD_NUM;
}
}
}
return ans;
}