【Codeforces 364D】Ghd

给你 n n n个数,求一个尽量大的数,使得数列中有超过 n 2 \frac{n}{2} 2n个数能被该数整除。
a i ≤ 1 0 12 a_i \leq 10^{12} ai1012


发现每一个数出现在能被整除的集合中的概率均 ≥ 1 2 ≥\frac{1}{2} 21,于是考虑随机。每一次猜测一个数在这个集合中,然后计算与其它数的gcd。最后查找一个最大的出现次数超过 n 2 \frac{n}{2} 2n的gcd即可。(若 r e s [ i ] ∣ r e s [ j ] res[i]|res[j] res[i]res[j] s u m [ i ] + = s u m [ j ] sum[i]+=sum[j] sum[i]+=sum[j]
我们分析一下这样做的正确率。每一次选对的概率 ≥ 1 2 ≥\frac{1}{2} 21,所以说一次选错的概率 ≤ 1 2 \leq \frac{1}{2} 21,即随机 x x x次的成功率为 1 − 1 2 x \Large 1-\frac{1}{2^x} 12x1。当 x x x取约 14 14 14时,其成功率可以接受。


        #include<bits/stdc++.h>
        #define reg register
        #define ll long long
        using namespace std;
        const int mn = 1000005;
        ll a[mn], res[mn];
        int sum[mn];
        inline ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
        int main()
        {
            srand(time(NULL));
            int n;
            scanf("%d", &n);
            for(int i = 1; i <= n; i++)
                scanf("%I64d", &a[i]);
            ll ans = 1;
            for(int T = 0; T < 13; T++)
            {
                int pos = ((rand() << 15) + rand()) % n + 1;
                if(a[pos] <= ans) continue;
                ll maxs = 1;
                for(reg int i = 1; i <= n; i++)
                    res[i] = gcd(a[i], a[pos]), maxs = max(res[i], maxs);
                if(maxs <= ans) continue;
                sort(res + 1, res + 1 + n); int cnt = 0;
                for(reg int i = 1; i <= n; i++)
                {
                    if(res[i] != res[i - 1])
                        res[++cnt] = res[i], sum[cnt] = 0;
                    ++sum[cnt];
                }
                for(reg int i = cnt; i; i--)
                {
                    if(ans >= res[i]) break;
                    int tmp = 0;
                    for(int j = i; j <= cnt; j++)
                        if(res[j] % res[i] == 0) tmp += sum[j];
                    if((tmp << 1) >= n) {ans = res[i]; break;}
                }
            }
            printf("%I64d\n", ans);
        }
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值