Solution -「LOCAL」过河
\(\mathcal{Description}\)
一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\)。求可达的整点数。
\(L\le10^{12}\),\(1\le a,b\le10^5\)。
\(\mathcal{Solution}\)
\(\mathcal{Case~1}\)
考场上玄学操作,天知道为什么兔子签到的姿势如此诡异。
显然先约 \(\gcd\)。我们从 \(0\) 次开始枚举 \(-b\) 的次数,设当前枚举到 \(k\),若 \(kb\equiv0\pmod a\),可以通过少一次 \(a\) 来完成,调出循环;否则,钦定 \(k\) 次 \(-b\) 时,可达的整点一定是一个模 \(a\) 剩余类中连续的区间,即 \(l,l+a,l+2a,\cdots,r\)。我们只需要维护出 \((l,r)\),累加 \(\frac{r-l}a+1\) 就能得到答案。考虑多一次 \(-b\) 对 \((l,r)\) 的影响,例如当 \(a=4,b=3\):
\]
首先左移 \(b\) 位,类似位运算,出界的低位被销毁:
\]
这个时候需要判断是否存在 \(l+ka\)(可能 \(b\) 是 \(a\) 的若干倍,不仅是一个 \(+a\) 可以拉回来的),若不存在,跳出。然后考虑更新 \(r\),它还能往后 \(+a\),一直顶满上限:
\]
于是模拟一下就解决了。复杂度 \(\mathcal O(a+b)\)。
\(\mathcal{Case~2}\)
可以打表证明当 \(a+b-1>L\),答案为 \(L+1\);否则暴力 DFS……
兔子可能是个傻瓜,嗯。
\(\mathcal{Code}\)
// case 1
#include <cstdio>
typedef long long LL;
inline char fgc () {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread ( p = buf, 1, 1 << 17, stdin ), p == q ) ? EOF : *p ++;
}
inline LL rint () {
LL x = 0; char s = fgc ();
for ( ; s < '0' || '9' < s; s = fgc () );
for ( ; '0' <= s && s <= '9'; s = fgc () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline void wint ( const LL x ) {
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
}
LL L, a, b;
bool vis[100005];
inline LL gcd ( const LL a, const LL b ) {
return b ? gcd ( b, a % b ) : a;
}
int main () {
freopen ( "river.in", "r", stdin );
freopen ( "river.out", "w", stdout );
L = rint (), a = rint (), b = rint ();
int d = gcd ( a, b );
a /= d, b /= d, L /= d;
if ( a == 1 ) return wint ( L + 1 ), putchar ( '\n' ), 0;
if ( b == 1 ) return wint ( a > L ? 1 : L + 1 ), putchar ( '\n' ), 0;
LL ans = L / a + 1, l = 0, r = a * ( L / a );
vis[0] = true;
for ( int useb = 1; !vis[1ll * useb * b % a]; ++ useb ) {
vis[useb * b % a] = true;
l -= b;
if ( l < 0 ) l += a * ( ( -l - 1 ) / a + 1 );
if ( l + b > r ) break;
r -= b;
if ( L - r >= a ) r += a * ( ( L - r ) / a );
if ( l > r ) break;
ans += ( r - l ) / a + 1;
}
wint ( ans ), putchar ( '\n' );
return 0;
}
\(\mathcal{Details}\)
还陷在省选难度签不动道的怪圈里……这道题算上拍浪费了差不多 \(40min\)。
麻烦兔子醒醒啊!
Solution -「LOCAL」过河的更多相关文章
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「LOCAL」Drainage System
\(\mathcal{Description}\) 合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...
- Solution -「LOCAL」Burning Flowers
灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\) 给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...
- Solution -「LOCAL」画画图
\(\mathcal{Description}\) OurTeam. 给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...
- Solution -「LOCAL」ZB 平衡树
\(\mathcal{Description}\) OurOJ. 维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...
- Solution -「LOCAL」舟游
\(\mathcal{Description}\) \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...
- Solution -「LOCAL」充电
\(\mathcal{Description}\) 给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...
- Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy
\(\mathcal{Description}\) Link.(完全一致) 给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...
随机推荐
- Java CAS 原理详解
1. 背景 在JDK 5之前Java语言是靠 synchronized 关键字保证同步的,这会导致有锁.锁机制存在以下问题: 在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问 ...
- docker 环境安装 jenkins
下载镜像运行 jenkins 默认服务器已经安装好了 docker 环境: 拉取 jenkins 镜像 docker pull jenkins/jenkins:lts 镜像的详细信息可以查看:http ...
- Linux防火墙--IPtables企业级配置策略思路
一.防火墙简介 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内.外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术. 防火墙发展应用:最早 ...
- Mysql存储过程二
1.MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限 procedure与function.trigger等创建时紧接着CREATE都有个definer可选项,该de ...
- 【Java】子类实例化过程
子类对象实例化的全过程 子类继承父类以后,就获取了父类中声明的属性或方法.创建子类的对象,在堆空间中,就会加载所有父类中声明的属性. 当我们通过子类的构造器创建子类对象时,我们一定会调用其父类的构造器 ...
- 一网打尽JVM垃圾回收知识体系
垃圾回收的区域 堆:Java 中绝大多数的对象都存放在堆中,是垃圾回收的重点 方法区:此中的 GC 效率较低,不是重点 由于虚拟机栈的生命周期和线程一致,因此不需要 GC 对象判活 在垃圾收集器对堆进 ...
- 2021最新Termux安装Metasploit
前言 因为某些脚本小子的用Termux搞破坏,所以Termux软件源移除了对Metasploit的支持,所以就不能直接用pkg和apt直接安装了. 但是不用担心,noob-hacker大大写了一个工具 ...
- Nginx 反向代理解决跨域问题分析
当你遇到跨域问题,不要立刻就选择复制去尝试.请详细看完这篇文章再处理 .我相信它能帮到你. 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://local ...
- winform 中心旋转 图片旋转
//设置左上角到中心点 g.TranslateTransform(int.Parse(x), int.Parse(y)); //旋转角度 g.RotateTransform(int.Parse(&qu ...
- [FatFs 学习] SD卡总结-SPI模式
SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...