intmain(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int t; std::cin >> t; while (t--) { int n; std::cin >> n; longlong a[n + 1]; a[0] = 0; for (int i = 1; i <= n; i++) { longlong x; std::cin >> x; a[i] = a[i - 1] + x; } longlong max_g = -1; for (int i = 1; i < n; i++) { longlong g = std::gcd(a[i], a[n]); max_g = std::max(max_g, g); } std::cout << max_g << '\n'; } return0; }
绷语言
1 2 3 4 5 6 7 8 9 10 11 12 13
main : Void main = let t = input run for t let n = input let a = [input for n] let (sum, ptr) = ([0 for n + 1], 0) rec if ptr == n then nope else (sum mut _[ptr + 1] = _[ptr] + a[ptr], ptr + 1) let (res, ptr) = (0, 1) rec if ptr == n then nope else (max res (gcd sum[ptr] sum[n]), ptr + 1) print(res)
逗号结合律哲学
逗号结合律仅弱于各中缀运算符,只要是有字母或 =、=> 的情况下,逗号结合性都更强。
其实关于逗号结合性的设计,我也一直在纠结。例如假如使用传统元组格式,上面的程序会从:
1 2 3
let sum, ptr = [0 for n + 1], 0 rec if ptr == n then nope else (sum mut _[ptr + 1] = _[ptr] + a[ptr]), ptr + 1
变成:
1 2 3
let (sum, ptr) = ([0 for n + 1], 0) rec if ptr == n then nope else (sum mut _[ptr + 1] = _[ptr] + a[ptr], ptr + 1)
传统元组相对无括号元组净增两对括号,但往往无括号元组容易引发歧义。例如假如写成:
1 2 3
let sum, ptr = [0 for n + 1], 0 rec if ptr == n then nope else sum mut _[ptr + 1] = _[ptr] + a[ptr], ptr + 1
用户可能很难看出问题,但由于 , 结合性强于 =,该代码应被视为:
1 2 3
let sum, ptr = [0 for n + 1], 0 rec if ptr == n then nope else sum mut _[ptr + 1] = (_[ptr] + a[ptr], ptr + 1)