题意:

有$Q$次询问,每次给定$X_i$和$Y_i$,求对于$1\leq x \leq X_i , 1 \leq y \leq Y_i$,$(x,y)$进行辗转相除法的步数的最大值以及取到最大值的方案数。

步数定义如下:
$(a,b)$和$(b,a)$步数相同;
$(0,a)$步数为0;
如果$a \leq b$,$(a,b)$的步数为$(b \% a,a)$的步数+1。

$Q \leq 3*10^5 , X_i,Y_i \leq 10^{18}$。

这种题我一看就懵了,明显要推什么结论,但是我怎么才能想到这和斐波那契数列有关呢?

atcoder的官方题解挂了,耗费了我2h去思考自己是英语太撇了还是太弱了

我们定义$f(a,b)$为$(a,b)$辗转相除的步数。对于斐波那契数列,我们规定$F[0]=F[1]=1$

首先,我们可以用归纳法证明结论,$f(F[i],F[i+1])=i$,并且如果有$f(x,y)=i \ (x<y)$,那么$x \geq F[i] , y \geq F[i+1]$

定义一个数对$(x,y)$是好的,当且仅当不存在$x'<x , y'<y$的$(x',y')$满足 $f(x',y')>f(x,y)$,我们发现只有好的数对才对答案有贡献

定义一个数对$(x,y)$是优秀的,若$f(x,y)=k$,那么$x,y \leq F[k+2]+F[k-1]$

我们可以得到一个结论:好的数对$(x,y)$经过一次辗转相除之后,一定得到一个优秀的数对

用反证法证明这个结论,对于一个数对$(x,y)$,$f(x,y)=k$,令$x<y$,若$y>F[k+2]+F[k-1]$:

因为$f(x,y)=k$,所以$x \geq F[k]$

所以如果一个好的数对$(a,b)=(y,py+x) , f(a,b)=k+1$,辗转相除之后得到$(x,y)$,那么

$a=y > F[k+2] , b=py+x \geq y+x > F[k+2]+F[k-1]+F[k] = F[k+3]$

所以存在$x'=F[k+2],y'=F[k+3]$,满足$f(x',y')>f(a,b)$。

然后我们可以用递推的思路,根据$f(x,y)=k$的优秀数对推出$f(x,y)=k+1$的优秀数对

优秀的数对并不多,而且每次推的时候只会多那么一两个的样子,所以可以直接预处理。

最后再根据优秀数对来算好的数对的数量就可以了。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=100+7,W=90;
const ll mod=1e9+7;
ll Td,n,m,ans,sum,f[maxn];char cc;ll ff;
template<typename T>void read(T& aa) {aa=0;ff=1; cc=getchar();while(cc!='-'&&(cc<'0'||cc>'9')) cc=getchar();if(cc=='-') ff=-1,cc=getchar();while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();aa*=ff;
}struct Node{ll x,y;Node(){}Node(ll x,ll y):x(x),y(y){}
}o;
vector<Node> G[maxn];int main() {ll x,y,s; f[0]=f[1]=1;For(i,2,W) f[i]=f[i-1]+f[i-2];G[1].push_back(Node(1,2)); G[1].push_back(Node(1,3));G[1].push_back(Node(1,4));For(i,1,W-3) {s=G[i].size();For(j,0,s-1) {o=G[i][j]; x=o.y; y=o.x+x;while(y<=f[i+3]+f[i]) {G[i+1].push_back(Node(x,y));y+=x;}}}read(Td);while(Td--) {read(n); read(m);if(n>m) swap(n,m);for(ans=1;f[ans+1]<=n&&f[ans+2]<=m;++ans) ;printf("%lld ",ans);if(ans==1) {printf("%lld\n",n*m%mod);continue;}s=G[ans-1].size(); sum=0;For(i,0,s-1) {o=G[ans-1][i]; x=o.x; y=o.y;if(y<=n) sum+=(m-x)/y%mod;if(y<=m) sum+=(n-x)/y%mod;sum%=mod;}printf("%lld\n",sum);}return 0;
}

转载于:https://www.cnblogs.com/Serene-shixinyi/p/9092381.html

agc015F Kenus the Ancient Greek相关推荐

  1. agc015F - Kenus the Ancient Greek(结论题)

    题意 题目链接 $Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max( ...

  2. [agc015f]Kenus the Ancient Greek

    前言 结论题我只能orz. 题解错了很不舒服. 题意 找到(n,m)以内点对欧几里得步数最大的点对个数. 做法 设f(a,b)表示欧几里得步数. 我们先设斐波那契数 F0=1,F1=1,Fi+2=Fi ...

  3. 解释型和编译型编程语言_解释型和编译型编程语言:有什么区别?

    解释型和编译型编程语言 Every program is a set of instructions, whether it's to add two numbers or send a reques ...

  4. Poj 1151-Atlantis 矩形切割

    题目:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...

  5. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  6. 057_Unicode字符官方标准八

    264. Shorthand Format Controls, 范围: 1BCA0–1BCAF 265. Byzantine Musical Symbols, 范围: 1D000–1D0FF 266. ...

  7. 054_Unicode字符官方标准五

    163. Linear B Syllabary, 范围: 10000–1007F 164. Linear B Ideograms, 范围: 10080–100FF 165. Aegean Number ...

  8. 034_Unicode标准

    1. Unicode标准 1.1. 由于ASCII字符集.ISO字符集.GBK字符集列出的字符集都有容量限制, 而且不兼容多语言环境, Unicode联盟开发了Unicode标准. 1.2. Unic ...

  9. [渝粤教育] 西南科技大学 英美文学 在线考试复习资料

    英美文学--在线考试复习资料 一.单选题 1.With Howells, James, and Mark Twain active on the literary scene, ( ) became ...

最新文章

  1. android x86 按键精灵,界面版按键精灵的使用【包含内置浏览器、打开程序的方法】...
  2. 【WPF】使用控件MediaElement播放视频
  3. 48万!百度推出全球最便宜RoboTaxi,赚钱能力2倍于人类网约车
  4. javascript createelement_贝程学院:Selenium与 JavaScript
  5. 添加中文数据出现问号_怪物猎人世界绚辉龙和冥赤龙的出现时间规律一览
  6. DNF包管理命令在CentOS 8和RHEL 8上的使用
  7. 《DSP using MATLAB》Problem 6.6
  8. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_4_方法引用_通过super引用父类的...
  9. 【转】一个小妙招能让你在服装上省下好多rmb
  10. 单片机步进电机正反转C语言程序,单片机控制步进电机正反转
  11. r4烧录卡内核安装_R4 Wood内核怎么用?R4烧录卡Wood R4内核详细使用教程
  12. tftpd32Linux,Tftpd32 DNS服务器拒绝服务漏洞
  13. Create.js实战-MovieClip操作
  14. Oracle 12c:配置em,解决em登录问题
  15. 计算机ms一级分数分配,计算机一级六大MS题型介绍
  16. ABC分类法在库存优化管理中的应用原理
  17. js开根号_原生js数值开根算法
  18. 移动电源有哪些产品?热门的移动电源推荐
  19. 网页怎么退出全屏,网页退出全屏有哪些快捷键?
  20. 微信小程序canvas上传PHP,微信小程序画布 canvas

热门文章

  1. python绘制科赫雪花(递归)
  2. python读取数据库之给变量_使用Python和SQLite,如何将数据库中的项读入变量?
  3. redis 槽点重新分配 集群_5000+字硬核干货!Redis 分布式集群部署实战
  4. vmware 12.5.3 linux,vmware12如何安装linux|opensuse42.3系统安装教程
  5. java核心api_java核心API
  6. php视频录制插件,Chrome浏览器录屏扩展插件
  7. 设计模式-策略模式,观察者模式,装饰者模式,静态工厂模式,工厂方法模式
  8. sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID...
  9. python 列表筛选数据
  10. 探究netty的观察者设计模式