/* ideone上でケース1000個全部流すと途中で切られてRuntimeErrorになるので、 500個ずつくらいに分けて流してね */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; class Ideone { /** * s(n) = s(0)*r^n + n*d となる r と d を返す * @param s 調べる数列。インデックスはゼロから始まり、3つ以上の項があると信じるw * @return s(0)と r と d を (s(0), r, d) = (0, 1, 2) にパックして返す。nullなら等差・等比数列ではなかった。 */ boolean flag = true; // 等差数列か調べる int d = s[1] - s[0]; for (int i = 2 ; flag && i < s.length ; i++) { if (d != s[i] - s[i-1]) flag = false; } if (flag) return new int[] {s[0], 1, d}; // 等差数列だった // 等比数列か調べる /*try { flag = true; double r = (double) s[1] / (double) s[0]; for (int i = 2 ; flag && i < s.length ; i++) { if (r != (double) s[i] / (double) s[i-1]) flag = false; } if (flag) return new int[] {s[0], (int) r, 0}; // 等比数列だった } catch (Exception e) { return null; } // 多分、ゼロ除算エラーなので等比数列ではなかった */ return null; // どれでもなかった } public static long[] makeSeriesFromParams(int[][] params, int begin, int end) { long[] result = new long[end - begin + 1]; int i = 0; for (int n = begin ; n <= end ; n++) { int j = n / params.length, m = n % params.length; } return result; } String line; while (null != (line = br.readLine())) { // 数列とパラメータの読み取り int[] o = new int[os.length]; os = null; int N = o.length / 3; // 循環長の最大 // 循環の調査 int L; int[][] params = null; boolean isFound = false; for (L = 1 ; L <= N ; L++) { // L は循環長 boolean flag = true; params = new int[L][3]; List<Integer> list = new ArrayList<>(); for (int p = 0 ; p < L ; p++) { // p は循環内でのオフセット位置 list.clear(); for (int i = p ; i < o.length ; i += L) list.add(o[i]); if (null == param) { // この循環長Lにおけるオフセット位置pでは数列が求まらなかった flag = false; break; } else { // 数列が求められた params[p][0] = param[0]; params[p][1] = param[1]; params[p][2] = param[2]; } } if (flag) { // 全てのオフセット位置で数列が求められた isFound = true; break; } } if (!isFound) { // 全てが数列となる循環長が見つからなかった } else { // 循環と全数列が見つかった long[] c = makeSeriesFromParams(params, begin, end); long sum = 0; for (long v : c) sum += v; if (sum != expSum) { for (int l = 0 ; l < params.length ; l++) { } //for (long v : c) System.out.print(v+","); } } } } }
Standard input is empty
101 : Expecred=2654, Obtained=2655 (0) : s(0)=82, r=1, d=83 ----------------- 104 : Expecred=154, Obtained=155 (0) : s(0)=37, r=1, d=0 (1) : s(0)=9, r=1, d=9 (2) : s(0)=23, r=1, d=0 (3) : s(0)=34, r=1, d=0 (4) : s(0)=16, r=1, d=0 (5) : s(0)=14, r=1, d=0 ----------------- 109 : Expecred=6084, Obtained=6085 (0) : s(0)=60, r=1, d=48 (1) : s(0)=41, r=1, d=48 (2) : s(0)=6, r=1, d=48 (3) : s(0)=37, r=1, d=48 ----------------- 416 : Expecred=2636, Obtained=2635 (0) : s(0)=55, r=1, d=50 (1) : s(0)=27, r=1, d=50 (2) : s(0)=5, r=1, d=50 (3) : s(0)=49, r=1, d=50 ----------------- 425 : Expecred=3499, Obtained=3498 (0) : s(0)=6, r=1, d=0 (1) : s(0)=48, r=1, d=12 ----------------- 436 : Expecred=35452, Obtained=35453 (0) : s(0)=86, r=1, d=64 (1) : s(0)=40, r=1, d=64 (2) : s(0)=25, r=1, d=64 -----------------