[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文 ...
随机推荐
- B3612 【深进1.例1】求区间和(前缀和)
[深进1.例1]求区间和 [深进1.例1]求区间和 题目描述 给定 \(n\) 个正整数组成的数列 \(a_1, a_2, \cdots, a_n\) 和 \(m\) 个区间 \([l_i,r_i]\ ...
- 聊聊HuggingFace Transformer
概述 参见:聊聊HuggingFace 项目组件 一个完整的transformer模型主要包含三部分:Config.Tokenizer.Model. Config 用于配置模型的名称.最终输出的样式. ...
- Django项目缓存优化
一.为什么要使用缓存 大家可以想一下Django的请求响应流程: → 用户浏览器输入URL地址 → Web服务器将HTTP请求转发给uWSGI服务器 → uWSGI服务器将Request请求转发给Dj ...
- 【krpano】密码插件
密码插件可以在浏览场景或者执行action之前弹出密码输入框,要求用户输入密码.当密码输入成功了才可以进行下一步操作. 下载地址:http://pan.baidu.com/s/1gfOKKKF 给场景 ...
- Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法
目录 命令行脚本参考 - bat 命令行脚本参考 - bash 值得学习的知识点 1. 识别终端使用的语言 2. 函数的编写 3. 获取用户的输入 4. bat文件老是乱码怎么办 有时候为了方便别人使 ...
- java中有哪些并发的List?只知道一种的就太逊了
java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发 ...
- 2023年Vue开发中的8个最佳工具
前言 Vue.js,一款当今非常流行的基于JavaScript的开源框架,旨在构建动态的可交互应用. Vue.js以其直观的语法和灵活的架构而广受全球开发者的欢迎和赞誉.随着时间的推移,Vue不断进化 ...
- 「にちじょう記録」MTIDnWtMOA
Mistakes That I Don't Want to Make Once Again. // Caution // 差分 / 前缀和后注意询问区间端点有变化-- 不要考虑了右边界就不考虑左边界 ...
- 10. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP内网穿透支持修改头信息
用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP内网穿透支持修改头信息 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy ...
- Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】
〇.简介 1.什么是组合设计模式? 一句话解释: 针对树形结构的任意节点,都实现了同一接口,他们具有相同的操作,可以通过某一操作来遍历全部节点. 组合模式通过使用树形结构来组合对象,用来表示部分以 ...