Codeforces Round #781 (Div. 2) 题解
A.GCD vs LCM
题目意思是询问T次,每次给一个数N,N=a+b+c+d.其中a,b,c,d都是正数,且gcd(a,b)=lcm(c,d),让你构造出这样的a,b,c,d的数列。
T是小于1e4,n小于1e9,复杂度应在O(Tlongn)。
先考虑暴力做法:
因为lcm(c,d)=cd/gcd(c,d);所以本题有等式gcd(a,b)gcd(c,d)=c*d;而gcd(a,d)若存在的话应为正整数,所以从1开始枚举gcd(a,b)的值,
再枚举C,D的值,遇到合法的GCD(a,b),再反过来枚举a,b的值,复杂度爆炸。运行下来,样例的结果是:
1 1 1 1
1 4 1 1
1 5 1 1
1 6 1 1
1 7 1 1
突然发现,若设gcd(a,b)=lcm(c,d)=1,那数列就可以构造为1,n-3,1,1。就是合法的,所以直接输出1,n-3,1,1就行,复杂度O(T);
代码如下:
#include <iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<"1 "<<n-3<<" 1 1"<<endl;
}
return 0;
}
B.Array Cloning Technique
题目意思是给你一个数列,你可以有两个操作,一是COPY任一个数列出来,二是对数列(可以是不同数列)任两元素进行交换。问操作几次后可以得到一个所有数相等的数列。
先分类与简化题目,1、若本身数列元素都相同,那不用操作,2,元素不相同,只交换没有用(数不会变),要COPY出一个新数列,交换时,每交换一次都要费一步,所以原
数列中元素数最多的那个元素(比如是X)不动,用新数列中的X交换原数列里其它的元素,若交换后还不全等的话,就再操作一遍。
那其中就分解成两个子问题:
一是求数列中最多重复的元素的数量,这用MAP很好解决;
int maxk=0;//最多重复的数的数量
map<int,int> q;//用map记录每个数出现的次数
for(int i =0;i<n;i++){
int k;
cin>>k;
q[k]++;
maxk=max(q[k],maxk);
}
二是模拟这个换元素的过程,单独写个函数:
int op(int n,int k){ //模拟交换的过程
if(n==k)return n-k;
else if(n<2*k) return n-k+1;
else return k+1+op(n,2*k);
}
所以代码就出来了:
#include<bits/stdc++.h>
using namespace std;
int op(int n,int k){
if(n==k)return n-k;
else if(n<2*k) return n-k+1;
else return k+1+op(n,2*k);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int maxk=0;//最多重复的数的数量
map<int,int> q;//用map记录每个数出现的次数
for(int i =0;i<n;i++){
int k;
cin>>k;
q[k]++;
maxk=max(q[k],maxk);
}
int ans=0;
ans=op(n,maxk);
cout<<ans<<endl;
}
return 0;
}
回头来看发现模拟过程这一段,若是从结果的角度回来看,原数列最后总是要全变成重复最多的那个数,所以答案应该等于n-maxk+copy的次数。
所以模拟过程这一段也可以写成;
int ans=0;
ans=n-maxk;
int z=maxk;
while(z<n){
ans++;
z*=2;
}
总结:
A题目考察GCD与LCM的概念,暴力做法可训练代码能力,结果可训练归纳能力;
B题目考察了MAP的应用。
复杂度明显大的题可考虑推结论,试着从结果来发现规律与性质。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具