agc015F Kenus the Ancient Greek
题意:
有$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;
}
agc015F Kenus the Ancient Greek的更多相关文章
- agc015F - Kenus the Ancient Greek(结论题)
题意 题目链接 $Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max( ...
- [AT2384] [agc015_f] Kenus the Ancient Greek
题目链接 AtCoder:https://agc015.contest.atcoder.jp/tasks/agc015_f 洛谷:https://www.luogu.org/problemnew/sh ...
- Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)
洛谷题面传送门 & Atcoder 题面传送门 一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...
- Atcoder训练计划
争取三天做完一套吧,太简单的就写一句话题解吧(其实也没多少会做的). 自己做出来的在前面用*标记 agc007 *A - Shik and Stone 暴力dfs即可,直接判断个数 *B - Cons ...
- A&G¥C015
A&G¥C015 A A+...+B Problem 正常A+B我还是会的,但是又加了个省略号就不会了/kk B Evilator 不会 C Nuske vs Phantom Thnook 以 ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- 20151207Study
Liberal lawmakers proposed a bill to reduce the cost of medicine for older Americans.自由主义立法者提出一条减少老年 ...
- hdu 1542 & & poj 1151
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- [POJ1151]Atlantis
[POJ1151]Atlantis 试题描述 There are several ancient Greek texts that contain descriptions of the fabled ...
随机推荐
- Cesium官方教程10--高级粒子特效
原文地址:https://cesiumjs.org/tutorials/Particle-Systems-More-Effects-Tutorial/ 高级粒子系统特效 这篇教程学习更多的效果,包括天 ...
- python学习笔记3.2_数据导出
一.data.to_csv:数据导出 1.to_csv:将数据导出为逗号分隔的文件 2.输出为其他分隔符的文件 写入到控制台,并打印:sys.stdout na_rep:对空值进行标注 二.serie ...
- Oracle的UTL_FILE.FOPEN学习笔记
Oracle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件. UTL_FILE.FOPEN(location in varchar2, filename in va ...
- osg::readPixels,glreadPixels截图,保存图片的alpha不对,总是255(1)
这个函数最近折磨了我很久很久,因为需要用osg截图保存到本地,但是这个图片要具有alpha值,也就是背景的alpha值全为0,但是在公司上用_image->readPixels(448, 28, ...
- 主从复制系列C
近日接到一个故障,主从异步方式,主 crash后,从不可用,检查发现从机Read_Master_Log_Pos与Exec_Master_Log_Pos不一致,似乎还有binlog在回放中,HA在等回放 ...
- 使用DynamoShake从dynamodb迁移到mongodb
去年和今年年初,我们开源了MongoShake和RedisShake分别用于MongoDB和Redis的迁移.同步.备份等多种需求.最近,我们的shake系列又进一步壮大,我们推出了一款dynamod ...
- 做网站-mysql表字段设计
https://mp.weixin.qq.com/s/HhdbmQqKmiw9IVnnL0Zyag VARCHAR与CHAR如何选择 使用VARCHAR理由 字段不经常更新 字段比较长,且长度不均(比 ...
- mysql视图详解
什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. ...
- Activiti实战01_认识Activiti
什么是Activiti Activiti是为解决工作流而创建的一套流程引擎.举个最简单的例子,请假流程就是一个工作流,从开始到审批到结束,像流一样的贯穿整个流程.在工作中最常见的就是OA了.工作流总是 ...
- (codeforces 853A)Planning 贪心
Helen works in Metropolis airport. She is responsible for creating a departure schedule. There are n ...