CF1696C Fishingprince Plays With Array 题解
题目大意
给定一个长度为 的数组 、一个长度为 的数组 和一个数字 ,现在对数组 进行以下操作:
- 选择数组 中一个 的倍数 替换成 个
- 选择数组 中 个相同的数字 替换成
请问能否把数组 变成数组 。
数据范围:,,,。
题目解析
发现两个操作是互逆的,所以我们判断是否可以把数组 和数组 通过这两个操作来转化成同一个数组。
所以我们只需要把两个数组中所有 的倍数都拆开,然后判断两个数组是否相同即可。
显然可能会拆出很多项,所以需要开一个结构体来表示数组,里面的两个变量分别代表这个数字和它的重复次数。
int n,m,k,a[maxn],b[maxn],len1,len2; ll sum1,sum2; struct JTZ{ int s; ll num; }tmpa[maxn],tmpb[maxn]; int solve(int arr[],JTZ res[],int len){ int nlen=0,tmp,i; ll cnt; for(i=1;i<=len;i++){ cnt=1; tmp=arr[i]; while(tmp%m==0) tmp/=m,cnt*=m; if(nlen==0||res[nlen].s!=tmp) nlen++,res[nlen].num=cnt,res[nlen].s=tmp; else res[nlen].num+=cnt; } return nlen; } void work(){ n=read(); m=read(); int i; for(i=1;i<=n;i++) a[i]=read(); k=read(); for(i=1;i<=k;i++) b[i]=read(); len1=solve(a,tmpa,n); len2=solve(b,tmpb,k); if(len1!=len2){ puts("No"); return; } for(i=1;i<=len1;i++) if(tmpa[i].num!=tmpb[i].num||tmpa[i].s!=tmpb[i].s){ puts("No"); return; } puts("Yes"); return; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析