题意

题目链接

$Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max(f(i, j))$,以及$max(f(i, j))$不同的数对$(i, j)$的个数

Sol

结论题Orz

设$f(x, y)$表示$(x, y)$辗转相除需要的步数,$fib(i)$表示第$i$个斐波那契数

常识:$f(fib[i], fib[i+1]) = i$。

定义一个数对是“好的”,当且仅当对于$(x, y)$,不存在更小的$x', y'$使得$f(x', y') > f(x, y)$

显然我们需要统计的数对一定是好的数对

定义一个数对是“优秀的”,当且仅当对于$(x, y)$,若$f(x, y) = k$, 满足$x, y \leqslant fib[k+2] + fib[k-1]$

结论!:一个好的数对辗转相除一次后一定是优秀的数对!

证明可以用反证法,也就是我先假设一个$f(a, b) = i$是好的,但是得到的数对$(x, y)$满足$y > fib[k+2] + fib[k-1]$

但是这样我们会得到一个$x' = f[i+2], y' = f[i+2]$满足$f(x', y')>f(a, b)$,所以不成立

那么现在要做的就是求“优秀的”数对的个数。

考虑直接用欧几里得算法的定义递推即可

不过代码是真·难写啊,去网上copy一份吧。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define Pair pair<LL, LL>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define LL long long
#define int long long
using namespace std;
const int MAXN = 1e6 + , B = , mod = 1e9 + ;
inline LL read() {
char c = getchar(); LL x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
vector<Pair> v[B + ];
LL f[B + ];
void Pre() {
f[] = f[] = ;
for(int i = ; i <= B; i++) f[i] = f[i - ] + f[i - ];
v[].push_back(MP(, )); v[].push_back(MP(, )); v[].push_back(MP(, ));
for(int i = ; i <= B - ; i++) {
for(int j = ; j < v[i].size(); j++) {
LL x = v[i][j].fi, y = v[i][j].se;
LL tmp = x; x = y; y = tmp + y;
while(y <= f[i + ] + f[i - ]) v[i + ].push_back(MP(x, y)), y += x;
}
}
}
main() {
// freopen("1.in", "r", stdin);
Pre();
int Q = read();
while(Q--) {
LL x = read(), y = read(), K;
if(x > y) swap(x, y);
for(K = ; f[K + ] <= x && f[K + ] <= y; K++);
cout << K << " ";
if(K == ) {cout << x * y % mod << endl; continue;}
LL ans = ;
for(int i = ; i < v[K - ].size(); i++) {
LL a = v[K - ][i].fi, b = v[K - ][i].se;
// printf("%I64d %I64d\n", a, b);
if(b <= x) ans += (y - a) / b % mod;
if(b <= y) ans += (x - a) / b % mod;
//if(a + b <= x && b <= y) ans++;
//if(a + b <= y && a <= x) ans++;
ans %= mod;
}
cout << ans % mod<< endl;
}
return ;
}

最新文章

  1. jsp内置对象
  2. jQuery data
  3. 使用StackExchange.Redis客户端进行Redis访问出现的Timeout异常排查
  4. Ubuntu16.04安装nginx
  5. HTTP POST 提交问题
  6. git 使用命令总结
  7. SSH学习笔记目录
  8. java 集合(list、set、map)的特点
  9. Robotium调用getActivity()导致程序挂起的方法
  10. 选择排序—堆排序(Heap Sort) 没看明白,不解释
  11. unity做游戏常用功能实现(一)多方向同时输入也能让物体正常移动
  12. 前后端分离djangorestframework——认证组件
  13. 01-JDK环境配置
  14. mvc中查询字符串请求过长
  15. python requests简介
  16. emwin 之变量定义位置
  17. BP神经网络的参数改进参考?
  18. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
  19. Difference between nn.softmax &amp; softmax_cross_entropy_with_logits &amp; softmax_cross_entropy_with_logits_v2
  20. Python 字典 dict() 函数

热门文章

  1. mysql主从服务器复制原理
  2. List for game to play latter
  3. redis GEO地理位置命令介绍
  4. ssh远程转发使远程主机在所有ip上监听
  5. linux中制作动态库
  6. 内核启动流程2-C语言部分的最后一个函数init_post()
  7. hdu1055
  8. java多线程系列:ThreadPoolExecutor
  9. spark svm
  10. 【关于安装mysql5.6的一些问题总结】