有一些长度相等的等差数列(数列中每个数都为0~59的整数),设长度均为L,将等差数列中的所有数打乱顺序放在一起。现在给你这些打乱后的数,问原先, L最大可能为多大。先读入一个数n(1<=n<=60),再读入n个数,代表打乱后的数。输出等差数列最大可能长度L。
#include <cstdio> int hash[60]; int n, x, ans, maxnum; int work(int now) { int first, second, delta, i; int ok; while (__[1]__ && !hash[now]) ++now; if (now > maxnum) return 1; first = now; for (second = first; second <= maxnum; second++) if (hash[second]) { delta = __[2]__; if (first + delta * __[3]__ > maxnum) break; if (delta == 0) ok = (__[4]__); else { ok = 1; for (i = 0; i < ans; i++) ok = __[5]__ && (hash[first + delta * i]); } if (ok) { for (i = 0; i < ans; i++) hash[first + delta * i]--; if (work(first)) return 1; for (i = 0; i < ans; i++) hash[first + delta * i]++; } } return 0; } int main() { int i; memset(hash, 0, sizeof(hash)); scanf("%d", &n); maxnum = 0; for (i = 0; i < n; i++) { scanf("%d", &x); hash[x]++; if (x > maxnum) maxnum = x; } for (ans = n; ans >= 1; ans--) if (n%ans == 0 && __[6]__) { printf("%d\n", ans); break; } return 0; }