洛谷题面传送门 & Atcoder 题面传送门

一道难度 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(找性质+乱搞)的更多相关文章

  1. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  2. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

  3. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...

  4. AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook

    题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...

  5. AtCoder Grand Contest 011 F - Train Service Planning

    题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...

  6. AtCoder Grand Contest 010 F - Tree Game

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...

  7. AtCoder Grand Contest 016 F - Games on DAG

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...

  8. AtCoder Grand Contest 015 E - Mr.Aoki Incubator

    题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_e 题目大意: 数轴上有\(N\)个点,每个点初始时在位置\(X_i\),以\(V_i\)的速 ...

  9. Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)

    洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...

随机推荐

  1. 【UE4】 补丁Patch 与 DLC

    概述 UE4 中主要使用 Project Launcher 来进行补丁和DLC的制作 补丁与 DLC 都需要基于某个版本而制作 补丁 与 DLC 最后以 Pak 形式表现, 补丁的 pak 可以重命名 ...

  2. Map中getOrDefault()与数值进行比较

    一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...

  3. Sequence Model-week2编程题1-词向量的操作【余弦相似度 词类比 除偏词向量】

    1. 词向量上的操作(Operations on word vectors) 因为词嵌入的训练是非常耗资源的,所以ML从业者通常 都是 选择加载训练好 的 词嵌入(Embedding)数据集.(不用自 ...

  4. [对对子队]会议记录5.18(Scrum Meeting5)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8.9 ​ 相关签入:feat:初步搭建了Lv8 吴昭邦 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8 ...

  5. Nginx高效核心

    Nginx高效核心 目录 Nginx高效核心 Introduction I/O特性 同步/异步 阻塞/非阻塞 常见的I/O模型 阻塞型 非阻塞型 多路复用模型(多路阻塞) 信号驱动模型 异步模型 Ng ...

  6. 零基础入门必备的Linux命令和C语言基础

    文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...

  7. GeoServer-Manager应用:java编码实现发布矢量数据或栅格数据至GeoServer

    目录 简介与下载 依赖 编码发布矢量数据 编码发布栅格数据 简介与下载 GeoServer-Manager是使用Java编写的面向GeoServer的客户端库,通过GeoServer的REST管理接口 ...

  8. C++链表常见面试考点

    链表常见问题: 单链表找到倒数第n个节点 用两个指针指向链表头,第一个指针先向前走n步,然后两个指针同步往前走,当第一个指针指向最后一个节点时,第二个指针就指向了倒数第n个节点. 判断链表有没有环 快 ...

  9. cf22A Second Order Statistics(STL-UNIQUE的使用)

    题意: N个数,找出第二大的数.如果没有输出-1. 思路: UNIQUE的使用. 代码: int a[105]; int n; int main(){ cin>>n; rep(i,0,n- ...

  10. jQuery中onload与ready区别

    onload和ready的区别document.ready和onload的区别为:加载程度不同.执行次数不同.执行速度不同.1.加载程度不同 document.ready:是DOM结构绘制完毕后就执行 ...