Logo Wy Online Judge

WyOJ

Paste!

#include <algorithm>
#include <cstdint>
#include <iostream>
#include <limits>

int main() {
	using namespace std;
	int n;
	cin >> n;
	auto arr = new int64_t[n];
	for(int i = 0; i < n; i++)	
		cin >> arr[i];
	
	auto line = new pair<int64_t, int64_t>[n];
	auto add = [&] (int from, int to) {
		line[to].first -= line[from].first;
		line[to].second -= line[from].second;
	};
	for(int i = n; i > 0; i--)
	{
		line[i - 1] = {1, -arr[i - 1]};
		for(int j = 2 * i; j <= n; j += i)
			add(j - 1, i - 1);
	}
	
	int64_t vmin = *max_element(arr, arr + n),
		vmax = numeric_limits<int64_t>::max();
	for(int i = 0; i < n; i++)
	{
		if(line[i].first > 0)
			vmin = max(vmin, (-line[i].second +
				line[i].first - 1) / line[i].first);
		else if(line[i].first < 0)
			vmax = min(vmax, -line[i].second / line[i].first);
		else if(line[i].second < 0)
		{
			cout << -1 << endl;
			goto END;
		}
	}
	if(vmin > vmax)
		cout << -1 << endl;
	else
		cout << vmin - arr[0] << endl;
END:
	delete[] line;
	delete[] arr;
	return 0;
}