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 }
B. 数颜色
C. 分组
原文地址:https://www.cnblogs.com/skyh/p/11296117.html
时间: 2024-10-13 07:58:10