模拟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 }

B. 数颜色

C. 分组

原文地址:https://www.cnblogs.com/skyh/p/11296117.html

时间: 2024-10-13 07:58:10

模拟12 题解的相关文章

省选模拟12 题解

A. Colorado Potato Beetle 暴力做法是直接bfs. 优化的方法是离散化. 将特殊的点的横纵坐标抽出来,然后用这些横纵坐标为1e12*1e12分成一个个块,容易发现每个块内的状态是一致的. 然后用与暴力类似的方法即可,注意最后统计的是每个块的实际大小. B. Distinct Paths 观察可知数据范围欺骗了你. 似乎剪枝(注意去重复状态)的搜索就能过. 一个更合理的做法是因为行是单调不降的,状压每个颜色的最早出现的列就好了. 但是还是需要一些玄学剪枝. C. 回忆树 容

HDU 1022 Train Problem I 模拟栈题解

火车进站,模拟一个栈的操作,额外的栈操作,查看是否能按照规定顺序出栈. 数据量很少,故此题目很容易AC. 直接使用数组模拟就好. #include <stdio.h> const int MAX_N = 10; char inOrder[MAX_N], outOrder[MAX_N], stk[MAX_N]; bool rs[MAX_N<<2]; int n; int main() { while (scanf("%d", &n) != EOF) { s

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

2018-10-25 模拟测试题解

目录 问题 A: 魏传之长坂逆袭 题目描述 输入 输出 样例输入 样例输出 题解 问题 B: 蜀传之单刀赴会 题目描述 [问题描述] 输入 输出 样例输入 样例输出 题解 问题 C: 吴传之火烧连营 [题目背景] [问题描述] 输入 输出 样例输入 样例输出 [样例解释] [数据规模和约定] 题解 本篇题解也发表于zwcblog作者是同一个人 问题 A: 魏传之长坂逆袭 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

NOIP模拟 8-21 题解

一份模拟题...水得要命真是没谁了. 减法 (sub.c/.cpp) 题目描述 东东在幼儿园刚刚学会了 20 以内的减法,就迫不及待的跑回家要给爸爸出题了.问“10-1”来考东东爸,东东爸想也没想就说是“1”.东东顿时喜笑颜开,臭爸爸连这都不知道.那你知道为啥么?嘻嘻,当然这不是题目了. 这回换东东爸出题了: 两个整数 A 和 B,问 A-B 的结果是多少. 其中 1<=A<=101000, 0<=B<=A. 东东一脸懵圈,说:“臭爸爸,我不会,你告诉我结果吧.“ 这回轮到东东爸懵

[CCF2015.12]题解

201512-1 数位之和 水题一个,取模除以10胡搞即可(不知道字符串为什么不行 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <casser

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环