贪心、数学、最大公约数与最小公倍数

操作可以让序列中任意两个数相减,符合更相减损术的形式。

注意到任意次操作后序列中仅能存在全局 $\gcd$ 的倍数,令全局 $\gcd$ 为 $X$,那么 $\operatorname{mex}_k$ 每隔 $X$ 个数能被序列中的数抵消一个,有 $k-1$ 次接续答案的机会,容易计算答案。注意如果 $n \neq 1$ 那么肯定能让序列中的元素变成 $0$,但是 $n=1$ 时不能让序列中的元素变成 $0$,应当单独处理。

时间复杂度 $O(n + \log V)$。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,ans;
void solution(){
    cin>>n>>k>>m,--k;
    if(n==1){
        if(m<=k) ans=k+1;
        else ans=k;
        return cout<<ans<<'\n',void();
    }
    ans=1;
    for(int i=1;i<=n-1;i++){
        static int x;
        cin>>x,m=__gcd(m,x);
    }
    for(int i=1;i<=n-1;i++) if(k>=m-1) ans+=m,k-=m-1;
    ans+=k;
    cout<<ans<<'\n';
}
int T;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solution();
    return 0;
}
最后修改:2024 年 09 月 26 日
如果觉得我的文章对你有用,请随意赞赏