F. Kuroni and the Punishment(随机化)

ll a[N],n;
vector<ll> fac;
set<ll> st;
void get_fac(ll x)
{
	for (ll i = 2;i*i <= x;i++)
	{
		if (x%i == 0)
		{
			fac.emplace_back(i);
			while (x%i == 0)x /= i;
		}
	}
	if (x > 1)fac.emplace_back(x);
}
int main()
{
#ifndef ONLINE_JUDGE 
	freopen("in.txt", "r", stdin); 
#endif	

	cin >> n;
	f(i, 1, n)scanf("%lld", &a[i]);
	mt19937 gen(chrono::steady_clock::now().time_since_epoch().count());
	uniform_int_distribution<> dis(1, n);
	int num = 0, top = min((ll)30, n);
	while (num < top)
	{
		int now = dis(gen);
		st.insert(a[now]);
		st.insert(a[now] + 1);
		if (a[now] > 2)st.insert(a[now] - 1);
		num++;
	}
	for (auto i : st)get_fac(i);
	sort(fac.begin(), fac.end());
	auto it=unique(fac.begin(), fac.end());
	fac.erase(it, fac.end());
	ll mi = n;
	for (auto I : fac)
	{
		ll num = 0;
		f(i, 1, n)
		{
			if (a[i] < I)num += I - a[i] % I;
			else num += min(I - a[i] % I, a[i] % I);
			if (num > mi)break;
		}
		mi = min(num, mi);
	}
	cout << mi << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值