agc015F - Kenus the Ancient Greek(结论题)
题意
$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 ;
- }
agc015F - Kenus the Ancient Greek(结论题)的更多相关文章
- agc015F Kenus the Ancient Greek
题意: 有$Q$次询问,每次给定$X_i$和$Y_i$,求对于$1\leq x \leq X_i , 1 \leq y \leq Y_i$,$(x,y)$进行辗转相除法的步数的最大值以及取到最大值的方 ...
- [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,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...
- [codevs5578][咸鱼]tarjan/结论题
5578 咸鱼 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...
- BZOJ_1367_[Baltic2004]sequence_结论题+可并堆
BZOJ_1367_[Baltic2004]sequence_结论题+可并堆 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 ...
- [BZOJ3609][Heoi2014]人人尽说江南好 结论题
Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏. 在过去,人们是要 ...
- 【uoj#282】长度测量鸡 结论题
题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...
- 【uoj#175】新年的网警 结论题+Hash
题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...
- 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组
题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...
随机推荐
- 面试题: Spring 框架 Bean的生命周期
[Java面试五]Spring总结以及在面试中的一些问题. 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本 ...
- R: vector 向量的创建、操作等。
################################################### 问题:创建.操作向量 18.4.27 怎么创建向量 vector,,及其相关操作 ??? 解 ...
- Java对象在内存中的状态
可达的/可触及的 Java对象呗创建后,如果被一个或者多个变量引用,那就是可达的,即从根节点可以触及到这个对象. 其实就是从根节点扫描,只要这个对象在引用链中,那就是可触及的. 可恢复的 Java对象 ...
- 每次选中数组中的N条数据, 如果让每条数据被选中的次数做到平均??
经常有这样的需求, 有一组数据, 每次展示其中的1条或N条,希望每条数据展示量可以做到平均. 一开始想依次展示每条数据并做记录,整组数据全展示一遍之后清除记录, 然后一直循环下去. 实现的过程中又觉得 ...
- python 里 np.array 的shape (2,)与(2,1)的分别是什么意思,区别是什么?
numpy.ndarray.shap是返回一个数组维度的元组. (2,)与(2,1)的区别如下: ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中, ...
- ASP.NET MVC实现layui富文本编辑器应用
先看看视图层 在视图层,使用的是视图助手--HtmlHelper,代替我们网页中传统的表单标签元素,其中的m代表实体模型.通过视图助手,为我们生成id和name属性相同的textarea标签. 备注: ...
- vs2013使用git报错
之前使用的是个人git账号,先转换为公司git账号,在同步时报Response status code does not indicate success: 403 (Forbidden) 上述问题是 ...
- nessus安装及使用
1.安装注册 (1)从https://www.tenable.com/products/nessus/select-your-operating-system上下载对应操作系统版本的nessus,结果 ...
- [CentOS7] at, bash, cron, anacron
声明:本文主要总结自:鸟哥的Linux私房菜-第十五章.例行性工作排程(crontab),如有侵权,请通知博主 at => /var/spool/at /etc/at.allow, /etc/a ...
- Spark Executor 概述
Spark Executor 工作原理: 1. 在CoarseGrainedExecutorBackend启动时向Driver注册Executor,其实质是注册ExecutorBackend实例,和E ...