题解 | 小红的数字分裂

小红的数字分裂

https://www.nowcoder.com/practice/277ff300713a4e119d11f3d384c48355

//朱波做了半天做完了才发现这题其实是找最大公约数,下面是朱波的方法(不建议学习所以不解释了)
#include <bits/stdc++.h>
#include <numeric>
using namespace std;
#define int long long

signed main() {
    int n;
    cin >> n;
    vector<int>a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    sort(a.begin(), a.end());
    int sum = accumulate(a.begin(), a.end(), 0LL);
    vector<int>mod;
    for (int i = 1; i < n; i++) mod.push_back((a[i] - a[0]) % a[0]);
    sort(mod.begin(), mod.end());
    int mod_min = 0;
    for (int i = 0; i < mod.size(); i++) {
        if (mod[i]) {
            mod_min = mod[i];
            break;
        }
    }
    if (mod_min == 0) cout << sum / a[0] - n;
    else {
        int mid;
        if (a[0] % mod_min == 0) cout << sum / mod_min - n;
        else {
            mid = a[0] % mod_min;
            while (mod_min) {
                int temp = mid;
                mid = mod_min % mid;
                if (mid == 0) {
                    cout << sum / temp - n;
                    break;
                } else mod_min = temp;
            }
        }
    }

    return 0;
}

//下面再附上更优的解法请各位享用
signed main() {
    int n;
    cin >> n;
    vector<int> a(n);
    
    int g = 0, sum = 0;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        g = gcd(g, a[i]);
        sum += a[i];
    }
    
    // 最终值 t 就是最大公约数 g
    int ans = sum / g - n;
    cout << ans << endl;
    
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

哞客37422655...:这就是真实社会,没有花里胡哨的安慰,让你感受到阶级分明,不浪费彼此时间。虽然露骨但是唉
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务