(((((((((((((((((((((((((((((((((((((((((((((((((((((4.21模拟题解(((((((((((((((((((((((((((((((((((((((((((((((((((((((((
欢迎查看本校最水题解
第1 题 小麦亩产一千八
【问题描述】
“有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,
话说HYSBZ(Hengyang School for Boys & Zy)学识渊博孩纸们一讲到粮食,都会想起印度那
个著名的故事:国王要在第一个格子里放入一粒小麦,接下来的格子放入前面一个格子的两
倍的小麦。这样所需小麦总数是巨大的,哪是不用金坷垃就能完成的任务?不过为了减轻国
王的任务,那个下棋获胜的宰相换了一个要求:“我只需要你在棋盘外放一粒小麦,可以将
其理解为第0 个格子,然后你需要在第一个格子里放入若干小麦,之后每一个格子放入前两
个格子的小麦数之和的小麦,并且要满足第a 个格子放x 粒小麦,第b 个格子放……”说到
这,宰相突然发现自己说的满足第a 个格子放x 粒小麦的情况可能不存在……欺君可是大罪
啊!国王看到宰相迟迟不说,自己也烦了!我自己来算!于是国王拜托你,让你算出第b
个格子应该放几粒小麦。当然,就算答案不存在,你也是要告诉国王的。
【输入格式】kela.in
该题有多组数据,请读到文件末结束。
对于每一组数据仅一行,3 个正整数a,x,b,分别表示第a 个格子放了x 粒小
麦,以及你所需要计算的是第b 个格子的小麦数量。
【输出格式】kela.out
对于每一次询问,仅1 个整数,为第b 个格子的小麦数量,若宰相说的情况不
存在,那么请输出-1。
啊啊我已经写出正解了然而因为一直while下去就爆〇了
这题我一看就知道是高配版fblq。我就自己推出了式子。也是非常简单的。计算这一段的代码如下:
1 if((x - fblq(a)) % (fblq(a - 1)) == 0){ 2 3 c = (x - fblq(a)) / fblq(a - 1); 4 5 printf("%lld\n",fblq(b) + c * fblq(b - 1)); 6 7 } 8 9 else printf("-1\n"); 10 11 }
再配上一个计算fblq的小函数
1 ll fblq(ll x) 2 3 { 4 5 if(f[x] != 0) return f[x]; 6 7 else{ 8 9 return f[x] = fblq(x - 1) + fblq(x - 2); 10 11 } 12 13 }
关于这个算法,题解告诉我们:
明显题目就是给出了一个拓展的Fibonacci 数列,其满足:
f[0]=1, f[1]=p, f[2]=p+1, f[3]=2*p+1……
原本的Fibonacci 数列满足:f’[0]=1, f’[1]=1, f’[2]=2, f’[3]=3……
设g[i]=f[i]-f’[i],那么其满足g[0]=0, g[1]=p-1, g[2]=p-1, g[3]=2p-2,
g[4]=3p-3……
已知f[a]=x,那么在a>0 的情况下,g[a]=x-f’[a]=f’[a-1]*(p-1)。f’[]我
们可以O(a)预处理出来,因此对于每组数据我们可以O(1)计算出p(答案
不存在的情况即无法整除的情况)。之后便O(b)递推计算答案就可以了。
每组数据的时间复杂度为O(b)。
我也没认真看他讲了什么。
关键还是这句罪恶的话
while(scanf("%d ",&a) != EOF)
emmmmmmmmmmmmmmmmm
我没什么可说的。
第2 题休息
【问题描述】
休息的时候,可以放松放松浑身的肌肉,打扫打扫卫生,感觉很舒服。在某
一天,某LMZ 开始整理他那书架。已知他的书有n 本,从左到右按顺序排列。他
想把书从矮到高排好序,而每一本书都有一个独一无二的高度Hi。他排序的方法
是:每一次将所有的书划分为尽量少的连续部分,使得每一部分的书的高度都是
单调下降,然后将其中所有不少于2 本书的区间全部翻转。重复执行以上操作,
最后使得书的高度全部单调上升。可是毕竟是休息时间,LMZ 不想花太多时间在
给书排序这种事上面。因此他划分并翻转完第一次书之后,他想计算,他一共执
行了多少次翻转操作才能把所有的书排好序。LMZ 惊奇地发现,第一次排序之前,
他第一次划分出来的所有区间的长度都是偶数。
【输入格式】rest.in
第一行一个正整数n, 为书的总数。
接下来n 行,每行仅一个正整数Hi,为第i 本书的高度。
【输出格式】rest.out
仅一个整数,为LMZ 需要做的翻转操作的次数。
这是求匿序对数,说是要用到归并排序……
这都是什么东西啊……
我真的不会啊……
第3 题军训
【问题描述】
HYSBZ 开学了!今年HYSBZ 有n 个男生来上学,学号为1…n,每个学生都必
须参加军训。在这种比较堕落的学校里,每个男生都会有Gi 个女朋友,而且每
个人都会有一个欠扁值Hi。学校为了保证军训时教官不会因为学生们都是人生赢
家或者是太欠扁而发生打架事故,所以要把学生们分班,并做出了如下要求:
1.分班必须按照学号顺序来,即不能在一个班上出现学号不连续的情况。
2.每个学生必须要被分到某个班上。
3.每个班的欠扁值定义为该班中欠扁值最高的那名同学的欠扁值。所有班的
欠扁值之和不得超过Limit。
4.每个班的女友指数定义为该班中所有同学的女友数量之和。在满足条件
1、2、3 的情况下,分班应使得女友指数最高的那个班的女友指数最小。
请你帮HYSBZ 的教务处完成分班工作,并输出女友指数最高的班级的女友指
数。
输入数据保证题目有解。
【输入格式】training.in
第一行仅2 个正整数n, Limit,分别为学生数量和欠扁值之和的上限。
接下来n 行每行2 个正整数Hi,Gi,分别为学号为i 的学生的欠扁值和女友
数。
【输出格式】training.out
仅1 个正整数,表示满足分班的条件下女友指数最高的班级的女友指数。
我连dp都不会……
我太菜了……