H-绵羊的银币

链接:https://ac.nowcoder.com/acm/contest/3036/H
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
我断然没想到面前这景象,被黑雾所包围的众兽,以及那辆由金角鹿所驱动的战车。
「显然你已经知道我是谁了吧」那个女人抚摸着金角鹿身上的皮毛
「阿尔忒弥斯,司掌狩猎和野兽的狩猎女神」我有点头疼,居然连这种神祇都能召唤而来,那个圣杯的确是个不得了的问题
「不错,我即是七骑之中的弓之骑士(archer)」她似乎很乐于享受这场闹剧「你只需要回答我的一个问题就可以继续前行了,若不能的话,最好你有百般武艺」
「洗耳恭听」我掏出一根雪茄点燃,想缓解一下自己
「曾有一个牧羊人和一个商人进行交易,但他们对交易的价格争执不下,最终他们来寻求我的智慧。但是我并不想他们过于轻易的得到神的帮助,于是我便提出一个规则。如果当前商人要向牧羊人购买一定数量的羊,那么价格应当等于购买这个数量的四分之一的羊的价格加上购买这个数量的一半的羊的价格。显然,羊只能一整只的卖出,而不能半只卖出,所以当这个数量不能被分成四份或两份,就应该下取整,这是对商人的优惠」
「这个问题最终会回到购买数量很小的情况」
「不错,商人不买羊,就不需要支付银币,而如果他购买一只羊,那么他需要支付一枚银币」她没有停下手上的动作「无论最始的数量多大,都会回归到一和零上面。想必你已经有了快捷计算出需要支付的金额的办法了吧,即使没有我也要开始提问了,若是无法回答,愿君安息」
我的脑中浮现了这三个公式
f[0] = 0
f[1] = 1
f[n] = f[n/2] + f[n/4] (n>=2)

输入描述:
第一行一个整数T ( 1 <= T <= 250000 ) ,表示T次询问。
下面T行,每行一个整数n ( 0 <= n <= 1018 ) ,表示当前需要购买多少只绵羊
由于输入输出过多,请使用scanf和printf,否则容易超时
n极大,log2(n)精度不够,请不要使用<math.h>的任何log函数,否则容易Wrong Answer
输出描述:
对于每个询问,输出需要支付的银币数量
示例1
输入
复制
4
1
2
3
4
输出
复制
1
1
1
2

题解

本题若用递归,则会超时。
将该函数的前十六列出可发现f(0)=0;f(1)到f(3)为1;f(4)到f(7)为2;f(8)到f(15)为3;f(16)为5。由此可以发现在2的n次方时发生改变。因为在2的n次方时这个数的二进制数为10的n次方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值