Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)
一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的。
首先第一问很简单,只要每次尽量让“辗转相除”变为“辗转相减”即可,具体构造就是 \((F_k,F_{k+1})\),其中 \(F_i\) 为斐波那契数列第 \(i\) 项,\(F_0=F_1=1\),也就是说最终的答案即为最大的 \(k\) 满足 \(F_{k-1}\le X\) 且 \(F_k\le Y\)(不妨假设 \(X\le Y\))。
接下来考虑第二问,我们记 \(A(i,j)\) 表示 \(i,j\) 辗转相除法求 gcd 的次数,\(B(i,j)\) 表示 \(X=i,Y=j\) 时的答案,那么我们显然要求的是 \(A(i,j)=B(i,j)=A(X,Y)\) 且 \(i\le X,j\le Y\) 的 \((i,j)\) 对数,不难发现这个对数可能很多,但我们还可以发现对于某个 \(A(i,j)=B(i,j),i<j\) 的二元组 \((i,j)\),一定有 \(A(i,j+ki)=B(i,j+ki),k\in\mathbb{Z}\),因此我们只用考虑 \(A(i,j)=B(i,j)\) 且 \(i<j\le 2i\) 的二元组 \((i,j)\) 即可,打个表即可发现这样的二元组个数不是太多,具体来说,满足 \(A(i,j)=B(i,j)=k,i<j\le 2i\) 的二元组 \((i,j)\) 总共只有 \(k-1\) 个,因此我们考虑这样一个思路:对每个 \(k\) 预处理出满足 \(A(i,j)=B(i,j)=k,i<j\le 2i\) 的所有二元组,然后每次询问暴力枚举每个这样的二元组统计答案,于是现在我们只需考虑怎样求出二元组即可。
首先 \(k=2\) 时候显然只有一个二元组 \((1,2)\),我们考虑已经求出了 \(k-1\) 时所有符合条件的二元组 \((a,b)\),那么显然 \(A(b,a+b)=A(a,b)+1\),而根据 \(a<b\le 2a\) 可知 \(a+b<2b\),因此 \(b<a+b<2b\),故 \((b,a+b)\) 为符合条件的二元组,又因为对于所有互不相同的二元组 \((a,b)\),它扩展得到的 \((b,a+b)\) 也两两不同,因此得到的 \(k-2\) 个二元组也两两互不相同。但是这样还会漏掉一个二元组,不难发现 \((F_{k+1}+F_{k-1},F_{k+1})\) 也是符合条件的二元组并且没有被我们计算,把它算上就不重不漏刚好 \(k-1\) 个了。
时间复杂度 \(\log^2A+q\log A\)。注意对于答案等于 \(1\) 的情形,所有形如 \((i,i)(i\in[1,\min(X,Y)])\) 的二元组也符合条件,因此答案要加上 \(\min(X,Y)\)
const int MAX=100;
const int MOD=1e9+7;
const ll MAXV=1e18;
ll fib[MAX+5];int cnt=1;
vector<pair<ll,ll> > prs[MAX+5];
int main(){
fib[0]=fib[1]=1;
while(fib[cnt]+fib[cnt-1]<=MAXV) fib[cnt+1]=fib[cnt]+fib[cnt-1],++cnt;
prs[1].pb(mp(1,2));
for(int i=2;i<=cnt;i++){
for(pair<ll,ll> p:prs[i-1]) prs[i].pb(mp(p.se,p.fi+p.se));
prs[i].pb(mp(fib[i+1],fib[i-1]+fib[i+1]));
} int qu;scanf("%d",&qu);
while(qu--){
ll x,y,ans=0;scanf("%lld%lld",&x,&y);
int cur=1;if(x>y) x^=y^=x^=y;
while(cur+2<=cnt&&fib[cur+1]<=x&&fib[cur+2]<=y) ++cur;
for(pair<ll,ll> p:prs[cur]){
if(p.fi<=x&&p.se<=y) ans+=(y-p.se)/p.fi+1;
if(p.se<=x) ans+=(x-p.se)/p.fi+1;ans%=MOD;
} if(cur==1) (ans+=x)%=MOD;
printf("%d %lld\n",cur,ans);
}
return 0;
}
Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)的更多相关文章
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
- AtCoder Grand Contest 017 F - Zigzag
题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...
- AtCoder Grand Contest 003 F - Fraction of Fractal
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...
- AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook
题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...
- AtCoder Grand Contest 011 F - Train Service Planning
题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...
- AtCoder Grand Contest 010 F - Tree Game
题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...
- AtCoder Grand Contest 016 F - Games on DAG
题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...
- AtCoder Grand Contest 015 E - Mr.Aoki Incubator
题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_e 题目大意: 数轴上有\(N\)个点,每个点初始时在位置\(X_i\),以\(V_i\)的速 ...
- Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)
洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...
随机推荐
- programmercarl——数组——二分查找
二分查找,在经过: 34--https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-arr ...
- 【UE4】读写 Texture 数据
创建texture 方式一 void AActor_Assignment2::TextureFromImage_Internal( const TArray<FColor>& Sr ...
- 记一次 .NET 某资讯论坛 CPU爆高分析
大概有11天没发文了,真的不是因为懒,本想前几天抽空写,不知道为啥最近求助的朋友比较多,一天都能拿到2-3个求助dump,晚上回来就是一顿分析,有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓 ...
- 6月6日 Scrum Meeting
日期:2021年6月6日 会议主要内容概述: 删除模板选择页面,画图页面新增模板选择 保存时后端判重 后端要新增数据分享url 主题色->lxd:画图教程->lsp:表格数据分析-> ...
- 基于websocket实现的一个简单的聊天室
本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...
- Python课程笔记(十一)
一.线程与多线程 1.线程与进程 线程指的是 进程(运行中的程序)中单一顺序的执行流. 多个独立执行的线程相加 = 一个进程 多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手 ...
- 中文NER的那些事儿4. 数据增强在NER的尝试
这一章我们不聊模型来聊聊数据,解决实际问题时90%的时间其实都是在和数据作斗争,于是无标注,弱标注,少标注,半标注对应的各类解决方案可谓是百花齐放.在第二章我们也尝试通过多目标对抗学习的方式引入额外的 ...
- DeWeb第1个通用化模块:登录模块,仅需要修改一个配置文件即可实现登录功能
演示: https://delphibbs.com/login.dw 开发环境和源代码 https://gitee.com/xamh/dewebsdk 效果图: 配置方法: 在Runtime目录中放一 ...
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...
- 【Java】 List和Array转换
List转Array toArray 首先展示初学者容易犯的错误示例 List<String> strList = new ArrayList<>(); strList.add ...