1 条题解
-
0
自动搬运
来自洛谷,原作者为

UltiMadow
Well I do.搬运于
2025-08-24 22:46:12,当前版本为作者最后更新于2023-04-20 21:32:16,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
upd: 修正了一些错误(
考虑把
gen_string的过程画到平面上,即画成一条从 到 的折线,折线上的所有点即可表示gen_string的所有前缀。称折线上一个点合法当且仅当它所代表的的前缀合法。
下文中所有射线 为以原点为端点,经过 的射线。
性质 1:点 合法当且仅当对于任意满足 的点 都有它在射线 和 同侧(在射线上的点定义为位于射线左上方)。
证明:考虑反证,假设存在点 不在射线 和 同侧,不妨假设 。
取 最小的满足条件的点(如果有多个则取 最大的),容易证明 的折线经过 。
由于要求 的折线和 的折线重合,所以 的折线也经过 ,而在这之后一步 的折线会向上走, 的折线会向右走,矛盾。
性质 2:对于满足 的整点 ,任意满足 的整点 都有 ,其中 为正整数。
证明:充分性显然,下证必要性。
构造 ,容易证明 $f_1\times f=f_1\times(k_1f_1+k_2f_2)\land f\times f_2=(k_1f_1+k_2f_2)\times f_2$,从而 ,由于 均为整点,可得 均为正整数。
又一个向量分解为两个线性无关的向量的分解方式唯一,所以必要性得证。
由性质 2,可得 是 与 之间最小的整点。
考虑如下算法:
- 初始令 ,满足 ,过程中保证射线 右下方及射线 左上方(不含射线 上的点)都被统计过了,且 和 均为合法点。
- 记 ,则 为合法点(由 是 与 之间的最小整点保证),接下来按照 对于 的位置决定令 或 ,继续向下递归。
- 若 ,则结束算法
但是这个算法漏统计了若干个形如 的点,考虑完善一下。
性质 3:若当前的 满足 ,记在此之前 已经连续变化了 次,则 合法。
证明:发现 在 的平行四边形内,而 为 与 之间的最小点,所以不存在横纵坐标都比 小的点满足它在 与 之间(这个画一下图应该会比较清楚)。
性质 4:算法结束时一定有 且 。
证明:考虑在算法执行过程中维护 ,则每一轮 或 会使 中较大值减去较小值,即辗转相减,最后剩余的数即为 。
由于 且 ,可以推得 。
不难发现算法结束时 和 均合法,所以答案还要加上 。
根据性质 4,这个算法是一个辗转相减的形式,将这个过程变为辗转相除即可做到单次询问 。
code:
#include<bits/stdc++.h> #define int long long using namespace std; int T,a,b; int solve(int a,int b){ int f1=b,f2=a,ret=0,co=1; while(f2){ if(f1>f2)ret+=co*((f1-1)/f2),f1=(f1-1)%f2+1; else ret+=f2/f1,f2%=f1,co=2; } return ret+2*(f1-1); } signed main(){ scanf("%lld",&T); while(T--){ scanf("%lld%lld",&a,&b); printf("%lld\n",solve(a,b)); } return 0; }
- 1
信息
- ID
- 8564
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者