模拟12 题解

A. 斐波那契(fibonacci)

首先想到a,b<=1e6的暴力:建树,直接向上标记求lca。

建树的过程中发现一个性质。

斐波那契第n代兔子,是n-2代及以前的兔子的儿子。

因为编号连续且与父亲编号大小有关,

设该节点的编号为$x$,在第$k$代,

则$f(x)=x-fib(k-1)$。

二分查找父亲,向上标记求lca即可。

(特判不换行,爆零两行泪)

(见代码第25行)

 1 #include<iostream>
 2 #include<cstdio>
 3 #define ll long long
 4 using namespace std;
 5 ll fib[70],a,b;
 6 int m;
 7 inline ll read(){
 8     register ll x=0; char ch=getchar();
 9     while(!isdigit(ch)) ch=getchar();
10     while(isdigit(ch)){
11         x=(x<<1)+(x<<3)+(ch^48);
12         ch=getchar();
13     }
14     return x;
15 }
16 int main(){
17     fib[1]=fib[0]=1;
18     for(int i=2;i<=65;++i) fib[i]=fib[i-1]+fib[i-2];
19     m=read();
20     while(m--){
21         a=read(); b=read();
22         if(b==a+1||a==b+1){
23             printf("1");
24             continue;
25         }
26         int x=lower_bound(fib,fib+63,a)-fib,y=lower_bound(fib,fib+63,b)-fib;
27         if(fib[x]==a&&fib[y]==b){
28             if((x-y)&1) printf("%d\n",1);
29             else printf("%lld\n",min(a,b));
30             continue;
31         }
32         while(a!=b){
33             if(b<a) a-=fib[lower_bound(fib,fib+63,a)-fib-1];
34             else b-=fib[lower_bound(fib,fib+63,b)-fib-1];
35         }
36         printf("%lld\n",a);
37     }
38     return 0;
39 }
View Code
扫描二维码关注公众号,回复: 6941812 查看本文章

B. 数颜色

C. 分组

猜你喜欢

转载自www.cnblogs.com/skyh/p/11296117.html
今日推荐