[UOJ216][UNR#2 2A] Jakarta Skyscrapers
印尼首都雅加达市有 $10^{18}$ 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 $1$ 到 $10^{18}$ 。除了这 $10^{18}$ 座摩天楼外,雅加达市没有其他摩天楼。
有 $10^{18}$ 只叫做 “doge” 的神秘生物在雅加达市居住,它们的编号依次是 $1$ 到 $10^{18}$。编号为 $i$ 的 doge 居住于编号为 $i$ 的摩天楼。每只 doge 都有一种神秘的力量,使它们能够不用跳跃就可以在摩天楼之间传递消息,如果编号为 $i$ 的 doge 和一个编号比他小的编号为 $j$ 的 doge 都知道了一个消息,它们可以使用神秘力量将消息传递给编号为 $i-j$ 的doge。
qmqmqm想知道它们是否掌握了这种力量。他将一条消息告诉了编号为 $a$ 的doge,又告诉了编号为 $b$ 的doge($a$ 可能和 $b$ 相等),让它们尽快传送给编号为 $c$ 的 doge。
请帮助 doge 们计算是否有方法使用不超过 $400$ 次力量将消息传递到 $c$ 号 doge ,或者告诉它们消息不可能在次数限制内传递到 $c$ 号 doge。
输入格式
输入包含一行三个正整数 $a,b,c$ 。
输出格式
如果不可能在次数限制内传递,输出一行一个整数 $-1$。
否则,第一行输出你进行操作的次数 $K$。之后 $K$ 行每行两个正整数表示你这次操作选择的 $i$ 和 $j$。
样例一
input
19 12 14
output
3
19 12
12 7
19 5
explanation
第一次操作前,知道消息的doge集合为 $\{19,12\}$。
第一次操作后,知道消息的doge集合为 $\{19,12,7\}$。
第二次操作后,知道消息的doge集合为 $\{19,12,7,5\}$。
第三次操作后,知道消息的doge集合为 $\{19,14,12,7,5\}$。此时符合条件了。
样例二
input
233 1 233
output
0
explanation
不需进行任何操作,就能使编号 $233$ 的doge知道消息。
样例三
input
4 2 1
output
-1
explanation
最初唯一的操作是选择 $i=4,j=2$,但这样会把消息传给编号为 $2$ 的doge,而它已经知道这个消息了,所以知道消息的doge集合没有变化,无法把消息告诉编号为 $1$ 的doge。
限制与约定
由于一些原因,本题使用捆绑测试。每个子任务有若干个测试点,分为 $5$ 个子任务,你只有通过一个子任务的所有测试点才能得到这个子任务的分数。
| 子任务 | 分值 | 限制 | 
|---|---|---|
| 1 | 10 | $a,b,c \leq 400$ | 
| 2 | 20 | $b=1$ 且 $a,c\leq 10^{18}$ | 
| 3 | 20 | $c=1$ 且 $a,b\leq 10^{18}$ | 
| 4 | 20 | $a,b,c \leq 10^9$ | 
| 5 | 30 | $a,b,c \leq 10^{18}$ | 
时间限制:$1\texttt{s}$
空间限制:$256\texttt{MB}$
看一下 \(c\) 什么时候 不合法。
一种情况时 \(c>a\)
还有一种时 \(\gcd(a,b)\nmid c\)
然后一个一定合法的构造是用辗转相减法求出 \(\gcd(a,b)\),然后再用 \(a\) 不断减 \(\gcd(a,b)\) 弄出 \(c\)。
可以用倍增优化,如果我现在有一个 \(x\),那么可以得到 \(a-x\) 和 \(a-2x\),然后就能得到 \(2x\)。所以后面部分的复杂度是 \(O(\log a)\) 的。
前面的复杂度写出来是 \(\sum log(x/y)\),由于 \(\prod \lfloor\frac xy\rfloor\) 不超过 \(n\) ,所以前面那个是 \(O(log n)\) 级别的。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a,b,c;
int m;
pair<LL,LL>p[405];
LL gcd(LL x,LL y)
{
	if(x<y)
		swap(x,y);
	if(x%y==0)
		return y;
//	printf("hjh:%lld %lld\n",x,y);
	p[++m]=make_pair(x,y);
	for(LL i=1;i*y*2<x;i<<=1)
	{
		p[++m]=make_pair(x-i*y,i*y);
		p[++m]=make_pair(x,x-2*i*y);
	}
	for(int i=0;i<=60;i++)
		if((x/y)>>i&1)
			p[++m]=make_pair(x,y<<i),x-=(y<<i);
	return gcd(y,x);
}
int main()
{
	scanf("%lld%lld%lld",&a,&b,&c);
	if(a<b)
		swap(a,b);
	LL k=gcd(a,b);
	if(c%k||c>a)
		return puts("-1"),0;
	if(a^k)
		p[++m]=make_pair(a,k);
	for(LL i=1;i*k*2<a;i<<=1)
	{
		p[++m]=make_pair(a-i*k,i*k);
		p[++m]=make_pair(a,a-2*i*k);
	}
	for(int i=0;i<=60;i++)
		if((a-c)/k>>i&1)
			p[++m]=make_pair(a,k<<i),a-=k<<i;
	printf("%d\n",m);
	for(int i=1;i<=m;i++)
		printf("%lld %lld\n",p[i].first,p[i].second);
}
[UOJ216][UNR#2 2A] Jakarta Skyscrapers的更多相关文章
- uoj #111. 【APIO2015】Jakarta Skyscrapers
		#111. [APIO2015]Jakarta Skyscrapers 印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1.除了这 NN 座摩 ... 
- UOJ 216 Jakarta Skyscrapers
		http://uoj.ac/problem/216 题意:给定A,B,C,如果集合中有数i,j(i>j),那么集合就会增加i-j这个数,问有没有在初始集合为{A,B}400步内生成C的方案. 思 ... 
- 【LOJ】#2887. 「APIO2015」雅加达的摩天楼 Jakarta Skyscrapers
		题解 事实上是个分块暴力 就是跳跃长度大于\(\sqrt{n}\)的狗最多有\(\sqrt{n}\)个位置 剩下跳跃长度小于\(\sqrt{n}\)的暴力记录 也就是两个\(dis\)数组 \(dis ... 
- 【APIO2015】Jakarta Skyscrapers
		题目描述 印尼首都雅加达市有 $N$ 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 $0$ 到 $N − 1$.除了这 $N$ 座摩天楼外,雅加达市没有其他摩天楼. 有 $M$ 只叫做 ... 
- UNR #1 题解
		A. 争夺圣杯 还是想说一下,这题是原题啊...想做的人可以戳codechef上的MTMXSUM(懒得贴链接了,套了个壳,不过正常人应该都能看得出来) 显然异或输出没什么奇怪的性质... 考虑一个元素 ... 
- APIO2015泛做
		可以在UOJ上提交也可以在bzoj上提交(权限) A. Bali Sculptures 对于前72%的数据,按位考虑,然后跑一点沙茶dp就行了. dp:用f[x][y]表示前x位分为y段是否满足条件. ... 
- 红米2A高配刷机记录
		2014816 机型:红米2A高配版 设备型号:2014816 CPU:高通 线刷:fastboot平台 http://192.168.7.118/MesReports/Reports/Cutting ... 
- mac上执行sed的编辑 -i命令报错sed: 1: "test.txt": undefined label ‘est.txt’或sed: 1: "2a\test\": extra characters after \ at the end of a command
		问题一 sed编辑命令:[sed -i 's/a/b/g' test.txt] 报错:sed: 1: "test.txt": undefined label 'est.txt' ... 
- 红米手机拍照效果测评(对比小米2A)
		小米相关的产品一向都很很受用户的欢迎,一个就是实惠,另一个就是配置还不错.近期小米推出的红米手机可谓是先声夺人,关注度异常火爆.今天刚抢的红米快递寄到了,来测试下红米手机的拍照表现,800万像素怎么样 ... 
- ios8.3 编译 arm64版 openssl-1.0.2a
		xcode是6.3版的,ios sdk 是8.3的, 到http://www.openssl.org/source/下载最新版本openssl-1.0.2a 解压后用文本编辑器打开configure文 ... 
随机推荐
- 《深入理解Java虚拟机》读书笔记:基于栈的字节码解释执行引擎
			虚拟机是如何调用方法的内容已经讲解完毕,从本节开始,我们来探讨虚拟机是如何执行方法中的字节码指令的.上文中提到过,许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行) ... 
- 修改DataTable中的值
			DataTable dt ;for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; row.BeginEdit() ... 
- Visual Studio 2022 设置代码补全
			Visual Studio 2022 设置代码补全 VS默认使用 Tab 键进行代码补全. 若要使用回车补全需要重新设置,具体路径如下:  工具----选项----文本编辑器----C/C++--- ... 
- How can I access GPT-4?
			How can I access GPT-4? Written by Joshua J.. Updated over a week ago API Access Most users will n ... 
- FreeRTOS 操作系统
			FreeRTOS操作系统 01 FreeRTOS 的定义和概述 定义:FreeRTOS(Free-Real-Time Operating System)是一个开源的实时操作系统内核,专门为嵌入式系统设 ... 
- java实现朴素rpc
			五层协议中,RPC在第几层? 五层协议 应用层 传输层 网络层 链路层 物理层 我不知道,我要去大气层! 远程过程调用(RPC),比较朴素的说法就是,从某台机器调用另一台机器的一段代码,并获取返回结果 ... 
- 2023-10-25:用go语言,假如某公司目前推出了N个在售的金融产品(1<=N<=100) 对于张三,用ai表示他购买了ai(0<=ai<=10^4)份额的第i个产品(1<=i<=N) 现给出K(
			2023-10-25:用go语言,假如某公司目前推出了N个在售的金融产品(1<=N<=100) 对于张三,用ai表示他购买了ai(0<=ai<=10^4)份额的第i个产品(1& ... 
- sql删除进程
			使用一下语句杀掉进程 USE master go DECLARE @dbname VARCHAR(200) SET @dbname = 'xxxx' --要关闭进程的数据库名 DECLARE @sql ... 
- angular,vue,react三大框架选型
			三大框架,本质都是基于js的web应用(前端做的都是web应用包括移动)框架,他们都是帮助我们解决问题的工具,具体用哪个,要结合具体场景. 这三者中,Angular的适用领域相对窄一些,React可以 ... 
- 又拍云+PicGo搭建图床教程
			具体搭建方法 https://blog.csdn.net/qq_41684621/article/details/114068076 这里有个细节 注意这里一定要加上 http:// 否则在自动生成 ... 
