藍橋杯—校內模擬賽(規律序列)
問題描述:
小明想知道,滿足以下條件的正整數序列的數量:
1. 第一項為 n;
2. 第二項不超過 n;
3. 從第三項開始,每一項小於前兩項的差的絕對值。
請計算,對於給定的 n,有多少種滿足條件的序列。
輸入格式:
輸入一行包含一個整數 n。
輸出格式:
輸出一個整數,表示答案。答案可能很大,請輸出答案除以10000的余數。
樣例輸入:
4
樣例輸出:
7
樣例說明:
以下是滿足條件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
評測用例規模與約定:
對於 20% 的評測用例,1 <= n <= 5;
對於 50% 的評測用例,1 <= n <= 10;
對於 80% 的評測用例,1 <= n <= 100;
對於所有評測用例,1 <= n <= 1000。
思路:
① 研究對象始終都是只有三項,所以用大小為3的數組用來存放研究的三個對象。——序列長度未知,所以考慮遞歸的思想。
② 第一項、第二項的確定規則和第三項和后面的確定規則不同,觀察得出,長度只有2的序列只有n(輸入的第一項n)個。
注:
由於不知道具體測試用例數據,所以本人也無法確定答案是否完全正確。自己手動算出1——5的數據輸入,測試出答案正確。
但是根據題目給出的評測用例規模和約定。
當輸入數據較大時,本答案會超時。
如果有大神做出完美答案,拜托評論留下。
1 import java.util.Scanner; 2 3 public class Main{ 4 static int n,out; 5 public static void main(String[] args) { 6 Scanner scan = new Scanner(System.in); 7 n = scan.nextInt(); 8 out = 0; 9 int[] arr = new int[3]; //arr用於存放一直變化的長度為3的序列研究對象 10 arr[0] = n; 11 for(int i = 1; i <= n; i++) { 12 arr[1] = i; 13 f(arr[0], arr[1]); 14 } 15 System.out.println((out+n)%10000); //加上的n是,序列長度為2的所有序列數量。 16 scan.close(); 17 } 18 private static void f(int arr0, int arr1) { 19 // TODO Auto-generated method stub 20 for(int i = 1; i <= n; i++) { 21 if(i < cha(arr0,arr1)) { 22 int arr2= i; 23 f(arr1,arr2); 24 out++; 25 } 26 } 27 } 28 private static int cha(int i, int j) { //返回絕對值 29 // TODO Auto-generated method stub 30 if(i>j) return i-j; 31 else return j-i; 32 } 33 }
_____________________
輸入:3 輸出:4
滿足條件的序列:
3 1
3 1 1
3 2
3 3
———————————
輸入:5 輸出:14
滿足條件的序列:
5 1
5 1 1
5 1 5
5 1 3
5 1 3 1
5 1 3 1 1
5 2
5 2 1
5 2 2
5 3
5 3 1
5 3 1 1
5 4
5 5
———————————