2021南京icpc J
题意:
给出两个整数 a , b a,b a,b,每次可以选择如下一个操作进行:
(1)把 a , b a,b a,b都+1
(2)把 a , b a,b a,b都-1
(3)把 a , b a,b a,b都除以一个他们的公共质因子
问最小次数,使得 a , b a,b a,b至少存在一个等于1
Solution:
不妨令 a ≤ b a\leq b a≤b
假设某个时候,我们没有质因子可以除,那么我们需要利用 + 1 , − 1 +1,-1 +1,−1移动到一个有公共质因子的地方,然后再操作,如果到某个地方,两数存在有公共质因子,显然,他们的差 b − a b-a b−a一定是这个公共质因子的倍数,于是,他们的公共质因子一定是 b − a b-a b−a的任意一个公共质因子,那么唯一分解 b − a b-a b−a,对于每个 a , b a,b a,b,可以有这样的操作,一直-1到某个有公共质因子的地方,或者一直-1
到1,显然第二个的次数是 a − 1 a-1 a−1,而第一种,我们需要枚举 b − a b-a b−a的质因子 p p p,此时有两种决策,即把 a a a移至最接近的两个 p p p的倍数,即 p × ⌊ a p ⌋ p\times\lfloor\frac{a}{p}\rfloor p×⌊pa⌋和 p × ⌈ a p ⌉ p\times \lceil\frac{a}{p}\rceil p×⌈pa⌉,然后除 p p p,此时操作次数为 ∣ r e s − a ∣ + 1 |res-a|+1 ∣res−a∣+1, r e s res res是 a a a移动到的数值,每次枚举决策,记忆化搜索即可
训练的时候一直调不出来,原来是有一个函数写反参数,向上取整脑子短路写错了。。
#include<bits/stdc++.h>
using namespace std;using ll=long long;
#define div ttttttmp
const int N=200005,inf=0x3fffffff;
const long long INF=0x3f3f3f3f3f3f,mod=998244353;int prime[N],cnt;
bool isprime[N];void make_prime()
{memset(isprime,true,sizeof(isprime));for(int i=2;i<=100000;i++){if(isprime[i]) prime[++cnt]=i;for(int j=1;j<=cnt&&i*prime[j]<=100000;j++){isprime[i*prime[j]]=false;if(i%prime[j]==0) break;}}
}ll ceil(ll a,ll b){return a%b?a/b+1:a/b;}vector<ll>div;
map<pair<ll,ll>,ll>map1;ll dfs(ll x,ll del)
{if(x==1) return 0;if(map1.count({x,del})) return map1[{x,del}];ll min1=x-1;for(int i:div){if(del%i) continue;if(i*(x/i)) min1=min(min1,dfs(x/i,del/i)+x-(i*(x/i))+1);if(i*ceil(x,i)) min1=min(min1,dfs(ceil(x,i),del/i)+i*ceil(x,i)-x+1);}return map1[{x,del}]=min1;
}void work()
{ll a,b;scanf("%lld%lld",&a,&b);if(a>b) swap(a,b);map1.clear(); div.clear();ll tmp=b-a;for(int i=1;i<=cnt&&tmp>1;i++){if(tmp%prime[i]==0) div.push_back(prime[i]);while(tmp%prime[i]==0) tmp/=prime[i];}if(tmp>1) div.push_back(tmp);printf("%lld\n",dfs(a,b-a));
}int main()
{make_prime();int t; cin>>t;while(t--) work();return 0;
}
2021南京icpc J相关推荐
- 【Java/补题/牛客/ACM赛制】2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛)
文章目录 题目链接 知识一览 题目列表 快输 C - GCD(数论分块) 题目链接 2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛) 知识一览 01-数论分块 题目列 ...
- 2021江西省icpc(A,B,D,F,G,H,J,K,L)
K.Many Littles Make a Mickle(签到题) 任意门 先从最简单的签到题开始吧 #include<iostream> #include<cstdio> # ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)J Just Another Game of Stones ——线段树区间更新小于x的数
This way 题意: 给你n个数,每次有两种操作: 1 l r v 表示a[i]=max(a[i],v)[l<=i<=r] 2 l r v 简单来说就是问你v和a[i](l<=i ...
- 2021下半年ICPC各类赛事时间日程
ICPC预选赛 共2站 网络预选赛名额分配(可以关注微信公众号ICPCNews) 网络赛1:9.19 网络赛2:9.25 PS:网络赛没有牌子,决定后面赛站的学校名额分配. 现场赛1-50名2个,50 ...
- 2021上半年ICPC各类赛事时间日程
ICPC区域赛 截止今日最新经确认的比赛时间更新如下: 昆明(昆明理工大学,线上赛) 2021年4月02-03 银川(宁夏理工学院,现场赛) 2021年5月15-16 沈阳(东北大学,现场赛) 202 ...
- 南京理工大学计算机考研大纲,2021南京理工大学考研大纲参考书目
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源:http://fangcai.100xuexi.com/Ebook/DigitalLibrary/BookNew.aspx?BookName=%u5 ...
- 南农计算机考研真题,2021南京农业大学考研历年真题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源:http://fangcai.100xuexi.com/Ebook/DigitalLibrary/BookNew.aspx?BookName=%u5 ...
- 南京邮电大学计算机学硕2021,南京邮电大学2021年硕士研究生拟录取名单
2021考研复试工作,已经大部分招生单位进入了尾声.目前有些学校公示出研究生拟录取名单.因此,参加完2021考研复试考生们,一定及时关注目标学校公告.下面,小编为大家给出--南京邮电大学2021年硕士 ...
- 2021南京航天航空大学820自动控制原理参考答案
一.(来源自动控制原理学习辅导知识精粹习题详解考研真题--孙优贤)(式2-53中C2C_2C2改为C1C_1C1) 二. 1. 设PDPDPD控制器的传递函数 Gc(s)=Kp(1+τs)G_{c ...
最新文章
- 取文字_有内涵的男孩名字:用三字经为宝宝取一个独特稀少有内涵的好名
- 画世界怎么用光影_【干货】详解光影的魅力及其绘画技巧,一起打造极致炫丽的光影世界吧!...
- java 线程休眠_百战程序员:java线程的休眠和回复
- Web前端技术分享:img标签与background插入图片的区别
- Python基础——PyCharm版本——第二章、数据类型和变量(超详细)
- css3蒙版运动,纯CSS3制作逼真的汽车运动动画
- 分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
- linux终端命令行用户名和密码,Linux入门篇 —— Linux 用户与组管理详解(system-config-users 命令行)| 七日打卡...
- 学习笔记:聚类算法Kmeans/K-均值算法
- udp测试工具linux系统,网络测试工具下载_Packet Sender(UDP/TCP网络测试工具)
- matlab 矩阵逻辑与,MATLAB矩阵的寻访与赋值
- android 如何把.swf作为开机动画,win10系统将PPT幻灯片转为SWF动画的操作方法
- 美区苹果id关闭双重认证_双重认证
- 怎么给图片加边框线?图片加边框的方法
- 人体动作捕捉与SMPL模型 (mocap and SMPL model)
- 工具类记录之Guawa的Splitter
- 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下: 1、 长度13位; 2、 以86的国家码打头; 3、 手机号码的每一位都是数字。
- subplot中的图例
- 隧道安全管理八大系统
- Third1: Basic Web applications BASIC NFS services triggering mount | Cloud computing