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

【补题】The 2021 ICPC Asia Nanjing Regional Contest Problem J. Xingqiu’s Joke

题意:多组样例T,给x,y,三个操作1.x+1,y+1    2.x-1,y-1    3.x/p,y/p,p是x,y的共素数,让x或y等于1问操作次数最少。

思路:

1.很简单想到的,为了把一个数变成1,要么减,要么除法,加法说白了也是为了除法。

2.x和y的除法不一定能直接求出,15和7不行16和8就可以了,看不出来怎么判断?分解d=(x-y),因为a+k,b+k的gcd肯定是d的某一个质因数(题目也这么要求的)
因为能有素数除一定满足a=kb,所以a-b=(k-1)*p一定是有关联的。

3.考虑对于当前剩下的x,y的除法选择其中一个质因数(其实就是爆搜,枚举能除的),但是很显然超时,但是枚举的时候可能会出现 先除3再除7 和 先除7再除3,所以其实是重复的……加入记忆化搜索,可能大大减少,本来是30^30,变成了类似组合数的时间复杂度(如果有错误欢迎指正)

那么就此解决了,本题关键记忆化搜索,也就是点3,利用记忆化,将本来其实只是改变除法顺序重复的搜索大大减少,时间一来就足够了。
参考了:J. Xingqiu‘s Joke(2021ICPC-南京)(记忆化搜索 + 数论)_[icpc2021 nanjing r] xingqiu's joke-CSDN博客
代码是vp的时候改来的,所有有些地方是繁琐不必要的,如果看不惯请移步原文。
代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
#define pii pair<int, int>
#define lowbit(x) (x & (-x))std::map<std::pair<int,int>,int> mp;int dfs(int x, int y, std::set<int> &se)
{if(mp.count({x,y})){return mp[{x,y}];}int ans=y-1;if(y==1){mp[{x,y}]=ans;return ans;}mp[{x,y}]=(y-1);for (auto i : se){int now=y-1;if((x-y)%i!=0) continue;int up = i - (y % i);if (up == i)up = 0;int down = y % i;if (1){int xx = x + up, yy = y + up;xx = xx / i;yy = yy / i;now=1+up+dfs(xx, yy, se);// std::cout << x << " 12 " << y << " " << now << '\n';mp[{x,y}]=std::min(now,mp[{x,y}]);}if (1){int xx = x - down, yy = y - down;xx = xx / i;yy = yy / i;now=1+down+dfs(xx, yy, se);// std::cout << x << " 23 " << y << " " << now << '\n';mp[{x,y}]=std::min(now,mp[{x,y}]);// std::cout << x << " 234 " << y << " " << mp[{x,y}] << '\n';}}return mp[{x,y}];}void solve()
{mp.clear();int x, y;std::cin >> x >> y;if (x < y)swap(x, y);int d = x - y;int now = d;std::set<int> zs;for (int i = 2; i <= sqrt(now); i++){if (now % i == 0){while (now % i == 0){now = now / i;}zs.insert(i);}}if (now != 1)zs.insert(now);dfs(x, y, zs);std::cout << mp[{x,y}] << '\n';// for(auto i : mp){//     std::cout << i.first.first << " " << i.first.second << " " << i.second << '\n';// }
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;cin >> t;while (t--)solve();}

http://www.xdnf.cn/news/8123.html

相关文章:

  • [Java][Leetcode middle] 6. Z 字形变换
  • TCP与UDP协议全面对比:从原理到应用场景深度解析
  • ROS2 camera_calibration 双目相机标定指令
  • 监控易一体化运维:网络拓扑管理,网络管理高效之道
  • 异常数据的检测
  • 【基础】Windows开发设置入门11:hyper-v虚拟机创建
  • 批处理操作优化思路
  • 使用Pyinstaller打包python,全过程解析【2025最详细】
  • 湖北理元理律师事务所:专业债务优化如何助力负债者重获生活掌控权
  • CS和BS架构
  • 《数据结构笔记一》: 指针、结构体、动态内存分配、算法时间复杂度。
  • Python绘制3D图表
  • PostgreSQL 18 升级新体验:pg_upgrade --swap 极简教程
  • BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试
  • b/s开发 1.0
  • DDS与PLL技术
  • 力扣HOT100之二叉树: 437. 路径总和 III
  • 8天Python从入门到精通【itheima】-29~31
  • dify介绍(优势与作用)
  • 小样本百分比的统计检验
  • AbMole推荐Rapamycin: 自噬、肿瘤、免疫、衰老研究的关键工具
  • 干货分享:90+深度学习开源数据集
  • React 第四十五节 Router 中 useHref() Hook的使用详解及注意事项
  • session、cookie或者jwt 解释一下
  • 十五、Hive 窗口函数
  • java基础(方法)
  • Ubuntu18.04安装ros
  • -40℃到+125℃全温域稳定!车规级晶振如何突破温度极限
  • 27-FreeRTOS的任务管理
  • 华为模拟器练习简单的拓扑图(3台路由器和2台pc)