\(\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\):

\[-~~~~-~~~~l~~~~-~~~~-~~~~-~~~~l+a~~~~-~~~~-~~~~-~~~~r~~~~-
\]

  首先左移 \(b\) 位,类似位运算,出界的低位被销毁:

\[-~~~~-~~~~-~~~~l+a~~~~-~~~~-~~~~-~~~~r~~~-~~~~-~~~~-~~~~-
\]

  这个时候需要判断是否存在 \(l+ka\)(可能 \(b\) 是 \(a\) 的若干倍,不仅是一个 \(+a\) 可以拉回来的),若不存在,跳出。然后考虑更新 \(r\),它还能往后 \(+a\),一直顶满上限:

\[-~~~~-~~~~-~~~~l+a~~~~-~~~~-~~~~-~~~~r-a~~~-~~~~-~~~~-~~~~r
\]

  于是模拟一下就解决了。复杂度 \(\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」过河的更多相关文章

  1. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  2. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

  3. Solution -「LOCAL」Drainage System

    \(\mathcal{Description}\)   合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...

  4. Solution -「LOCAL」Burning Flowers

      灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\)   给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...

  5. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  6. Solution -「LOCAL」ZB 平衡树

    \(\mathcal{Description}\)   OurOJ.   维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...

  7. Solution -「LOCAL」舟游

    \(\mathcal{Description}\)   \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...

  8. Solution -「LOCAL」充电

    \(\mathcal{Description}\)   给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...

  9. Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy

    \(\mathcal{Description}\)   Link.(完全一致)   给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...

随机推荐

  1. Centos安装rrdtool的yum源

    由于centos的标准组件中是不带rrdtool的,因此我们需要添加一个dag的yum源,以安装rrdtool. 修改/etc/yum.repos.d/CentOS-Base.repo, #vi /e ...

  2. 18张图,详解SpringBoot解析yml全流程

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,项目里有一个需求,需要一个开关控制代码中是否执行一段逻辑,于是理所当然的在yml文件中配置了一个属性作为开关,再配合nacos就可 ...

  3. day 11 算法的时间空间复杂度

    (1).有以下程序: 求输入的n值(除1和n)之外的所有因子之和. 分析:这里函数内的循环体i初值不能为零.%是表示"取余",0除以任何数都不会存在余数的,所有是余数为0. (2) ...

  4. 小程序onShareAppMessage有点迷

    小程序遇到的问题 起因 目前项目需求是分享时携带参数去进行裂变,但是在查看微信文档后发现有onShareAppMessage这个页面处理事件可以使用.事件可以使用return一个Object,用于自定 ...

  5. JSF/SpringMVC/Struts2区别与比较

    转自SpringMVC与Struts2区别与比较总结 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文, ...

  6. shell $用法

    $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上 ...

  7. python 小兵(9)生成器

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  8. .NET6: 开发基于WPF的摩登三维工业软件

    MS Office和VisualStudio一直引领着桌面应用的时尚潮流,大型的工业软件一般都会紧跟潮流,搭配着Ribbon和DockPanel风格的界面.本文将介绍WPF下两个轻量级的Ribbon和 ...

  9. [NOI Online #1 提高组]

    A 首先从 \(t = 2\) 的特殊部分分出发. 不难发现这个操作是很不直观的,于是可以考虑对于每个操作 \((u, v)\) 在 \(u, v\) 之间连一条无向边. 显然连通块之间要分开考虑,对 ...

  10. JS RegExp对象(正则表达式)

    笔记整理自:廖雪峰老师的JS教程 正则表达式语法:https://www.runoob.com/regexp/regexp-tutorial.html 目录 创建方式 方式一 方式二 简单使用 判断正 ...