当前位置: 首页 > news >正文

Codeforces Round 973 (Div. 2) F. The Sum of the k-th Powers 数论、暴力

题目链接

题目大意

给一个长度为 n n n ( 1 ≤ n ≤ 1 0 5 ) (1 \leq n \leq 10^5) (1n105)的数组 a [ i ] a[i] a[i] ( 1 ≤ a i ≤ 1 0 5 ) (1 \leq a_i \leq 10^5) (1ai105),可以对数组任意排序,求 g c d ( a 1 ) + g c d ( a 1 + a 2 ) + ⋅ ⋅ ⋅ + g c d ( a 1 , a 2 , ⋅ ⋅ ⋅ , a n ) gcd(a_1)+gcd(a_1+a_2)+ \cdot \cdot \cdot + gcd(a_1,a_2, \cdot \cdot \cdot ,a_n) gcd(a1)+gcd(a1+a2)++gcd(a1,a2,,an) 的最小值。

思路

首先在不断加入数的过程中, g c d gcd gcd 要么保持不变要么会下降,且最少会下降 2 2 2。考虑 g c d gcd gcd 的种类, l o g ( 1 0 5 ) / l o g ( 2 ) < 17 log(10^5)/log(2)<17 log(105)/log(2)<17 ,在这题也就最多16个。暴力循环最多16次找到使得 g c d gcd gcd下降最猛的数放前面,直到没有数使得 g c d gcd gcd 下降,剩下的所有数的前缀 g c d gcd gcd 值将保持为同一个最小的值,时间复杂度 O ( 16 ∗ n ) O(16*n) O(16n) .

code

#include<bits/stdc++.h>
#define int long long

using namespace std;
const int N=1e5+10;
int a[N];
bool st[N];

int gcd(int a,int b) {
    return b==0?a:gcd(b,a%b);
}

void solve() {
    int n;
    cin>>n;
    memset(st,0,sizeof st);
    for(int i=1;i<=n;++i)
        cin>>a[i];
    sort(a+1,a+n+1);
    int res=a[1];
    int now=a[1];
    st[1]=1;
    int cnt=1;
    while(1) {
        int flag=0;
        int tmp=now;
        for(int i=1;i<=n;++i) {
            if(st[i]) continue;
            if(gcd(a[i],now)<tmp) {
                tmp=gcd(a[i],now);
                flag=i;
            }
        }
        if(!flag) break;
        else {
            cnt++;
            st[flag]=1;
            now=tmp;
            res+=now;
        }
    }
    // cout<<cnt<<' '<<now<<'\n';
    res+=(n-cnt)*now;
    cout<<res<<'\n';
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}
http://www.dtcms.com/a/59070.html

相关文章:

  • 前端杂的学习笔记
  • Java之IO流
  • winform基于antdui中table控件的使用
  • System Enginner系统工程师成长思考
  • 爬虫相关的零碎知识
  • Android Activity的启动器ActivityStarter入口
  • 力扣刷题167. 两数之和 II - 输入有序数组
  • 游戏引擎学习第147天
  • sanitizer和valgrind
  • (二十七)Java-ThreadPoolExecutor
  • laravel中 添加公共/通用 方法/函数
  • 【从零开始学习计算机科学】计算机组成原理(一)计算机的发展历史 与 分类
  • Android Glide 图片解码与转换模块原理深度剖析
  • 开发ai模型最佳的系统是Ubuntu还是linux?
  • 链接器与加载器
  • golang中具有 “no copy“的类型
  • 基于SpringBoot的“积分制零食自选销售平台”的设计与实现(源码+数据库+文档+PPT)
  • 逐梦DBA:Linux版本 MySQL的安装
  • 初识Apache Flink:起源、设计理念与企业级应用全景解析
  • 跟着 Lua 5.1 官方参考文档学习 Lua (12)
  • SSM配置拦截器
  • 基于Python+Vue的智能服装商城管理系统的设计与实现
  • RISC-V医疗芯片工程师复合型转型的路径与策略
  • 在 Ubuntu 下通过 Docker 部署 Caddy 和 PHP-FPM 服务器
  • P8925 「GMOI R1-T2」Light 题解
  • 双指针法之移动零(新数组)
  • shell的模拟实现 ─── linux第16课
  • 邮件发送器:使用 Python 构建带 GUI 的邮件自动发送工具
  • 什么是OFD文件?2025年我推荐新版OFD阅读器和PDF阅读器,双合一
  • 【算法方法总结·五】链表操作的一些技巧和注意事项