zoukankan      html  css  js  c++  java
  • HDU6025 Coprime Sequence【前缀GCD+后缀GCD】

    问题链接HDU6025 Coprime Sequence

    问题简述去除数列中的一个数字,使去除后数列中所有数字的gcd尽可能大

    问题分析这是一个计算GCD的问题。

    程序说明

    数组prefixgcd[],对于prefixgcd[i]=g,g为a[0]-a[i]的GCD,称为前缀GCD。

    数组suffixgcd[],对于suffixgcd[i]=g,g为a[i]-a[n-1]的GCD,称为后缀GCD。

    有了这两个GCD值的数组,那么去掉a[i]的GCD为gcd(prefixgcd[i - 1], suffixgcd[i + 1]),从中找出最大值即可。

    题记(略)


    AC的C++语言程序如下:

    /* HDU6025 Coprime Sequence */
    
    #include <iostream>
    
    using namespace std;
    
    const int N = 100000;
    int a[N], prefixgcd[N], suffixgcd[N];
    
    inline int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    
    int main()
    {
        int t, n;
    
        cin >> t;
        while(t--) {
            cin >> n;
    
            for(int i=0; i<n; i++)
                cin >> a[i];
    
            // 计算前缀GCD
            prefixgcd[0] = a[0];
            for(int i=1; i<n; i++)
                prefixgcd[i] = gcd(prefixgcd[i - 1], a[i]);
    
            // 计算后缀GCD
            suffixgcd[n - 1] = a[n - 1];
            for(int i=n-2; i>=0; i--)
                suffixgcd[i] = gcd(a[i], suffixgcd[i + 1]);
    
            int ans = max(suffixgcd[1], prefixgcd[n - 2]);
            for(int i=1; i<n - 1; i++)
                ans = max(ans, gcd(prefixgcd[i - 1], suffixgcd[i + 1]));
    
            cout << ans << endl;
        }
        return 0;
    }



  • 相关阅读:
    iOS开发- 蓝牙后台接收数据(BLE4.0)
    代码优化之减少重复代码-实践
    微信iOS多设备多字体适配方案总结
    iOS微信小视频优化心得
    iOS项目工程及目录结构
    手机淘宝 521 性能优化项目揭秘
    最大连续和
    struts2入门
    Maven环境搭配及继承
    easyui高级控件
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563744.html
Copyright © 2011-2022 走看看