F. Kuroni and the Punishment

传送门

题意:
给出一段序列,可以进行的操作是对其中的一个元素+1,或者-1,使最后的所有元素的gcd不为1,问最少的操作次数


思路:
首先,对于假设n个数中奇数有N个,那么最少的操作次数就是N个,对所有的奇数 + 1,即可变为偶数,gcd自然就等于2了,然后N是最坏的情况,如果假设有x数操作y次,y = 2, 3..., 有z个数是操作1次的,那么有一个不等式 y * x + z <= N, z越大,越接近变一次的,x越小,那x最大的情况就是z = 0的时候,然后y取2,意思就是他一个数变多次的数量最多就n / 2, 剩下的变一次和不变的次数是n / 2, 然后最后的gcd, 肯定是可以通过这些变一次和不变的质数的倍数,所以只要去枚举这些质数即可,对的可能性是 112k, k代表枚举的数量


总结:
数学推结论,高概率过问题,可以随机化去处理,然后随机写法

点击查看代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);
#define endl '\n'
using namespace std;

typedef long long ll;
const ll MAXN = 2e5 + 10;
ll n;
ll a[MAXN];
set<ll> st;

void get_prime(ll x)
{
    if (x == 0 || x == 1)
        return;
    for (int j = 2; j <= sqrt(x); ++j)
    {
        if (x % j == 0)
        {
            st.insert(j);
            while (x % j == 0)
                x /= j;
        }
    }
    if (x != 1)
        st.insert(x);
}

int main()
{
    IOS; cin.tie(0), cout.tie(0);
    srand(time(0));
    cin >> n;
    ll ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        if (a[i] & 1)
            ++ans;
    }
    if (n <= 100)
    {
        for (int i = 1; i <= n; ++i)
            get_prime(a[i]), get_prime(a[i] + 1), get_prime(a[i] - 1);
        for (auto it : st)
        {
            ll sum = 0;
            for (int i = 1; i <= n; ++i)
            {
                if (a[i] <= it)
                    sum += it - a[i];
                else
                    sum += min(it - a[i] % it, a[i] % it);
            }
            ans = min(ans, sum);
        }
    }
    else
    {
        for (int i = 1; i <= 100; ++i)
        {
            int pos = (int)(((double)rand() - 1) / RAND_MAX * n) + 1;
            get_prime(a[pos]), get_prime(a[pos] + 1), get_prime(a[pos] - 1);
        }
        for (auto it : st)
        {
            ll sum = 0;
            for (int i = 1; i <= n; ++i)
            {
                if (a[i] <= it)
                    sum += it - a[i];
                else
                    sum += min(it - a[i] % it, a[i] % it);
            }
            ans = min(ans, sum);
        }
    }
    cout << ans << endl;
    return 0;
}

posted @   YUGUOTIANQING  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示