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\) 这个条件有什么用.我们 ...
随机推荐
- java的加载与执行原理详解
java程序从开发到最终运行经历了什么? (31) 编译期: 第一步:在硬盘某个位置(随意),新建一个xxx.java文件 第二步:使用记事本或者其他文本编辑器例如EditPlus打开xxx.java ...
- better-scroll快速上手及封装(vue项目)
愿你有诗有梦,有坦荡荡的远方 本文声明:这是一篇学习coderwhy老师的vue2课程的一个笔记,所以本文章是在vue项目中实现,没学过vue的大佬们可以举一反三. 使用场景及介绍 BetterScr ...
- SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目
如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...
- 热身训练4 Article
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...
- 如何理解Stand SPI Dual SPI 和Quad SPI??
1.首先看一下接口 Standard SPI: CLK, /CS, DI, DO, /WP, /Hold Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold Quad S ...
- 野指针和free总结超有用的资料
在C语言项目中,经常会遇到需要程序员手动分配内存的地方.这样做能够节省大量的内存空间,也让程序更加灵活.只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合.这个组合使用 ...
- Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治
题目链接 $CDQ$分治. 考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响. 计算时,排序加上树状数组即可. 然后再递归处理$[l,mid]$和 ...
- [源码解析] PyTorch 分布式(2) ----- DataParallel(上)
[源码解析] PyTorch 分布式(2) ----- DataParallel(上) 目录 [源码解析] PyTorch 分布式(2) ----- DataParallel(上) 0x00 摘要 0 ...
- windows 上搭建 sftp 服务器 -freesshd全过程( 在linux上部署逐浪CMS的必读教程)
文章标题: windows 上搭建 sftp 服务器 - freesshd全过程 关键字 : freesshd 文章分类: 教程 创建时间: 2020年3月23日 缘由 动手 第一步:添加用户 第二步 ...
- 大爽Python入门教程 3-5 习题
大爽Python入门公开课教案 点击查看教程总目录 1 求平方和 使用循环,计算列表所有项的平方和,并输出这个和. 列表示例 lst = [8, 5, 7, 12, 19, 21, 10, 3, 2, ...