vijos- P1385盗窃-月之眼 (水题 + python)

本文介绍了一道关于寻找集合B中元素的最大数量的数学问题,集合B为集合A的子集,其中A包含从1到n的所有整数,并且对于B中的任意元素x,2x都不属于集合B。文章提供了Python代码实现,展示了如何通过递归方式计算出最大子集的数量。
P1385盗窃-月之眼

背景

怪盗基德 VS OIBH
第三话

描写叙述

怪盗基德第三次来到熟悉的OIBH总部。屡屡失败的OIBH这次看守的是The Eye of Moon。还是那个
房间。还是那扇门,不同的是OIBH对password锁进行了改进。这次屏幕上仅仅显示一个数n(基德:这是
改进了还是退化了?)。

password生成方法:设集合A中A={1,2,...,n}。B为A子集。

对于B中随意一个元素x,2x均不在集合B中。

B中元素数目最大值即为password。

格式

输入格式

一行,一个整数n(1<=n<=maxlongint)

输出格式

仅仅有一个整数m。表示B中元素最大值

例子1

例子输入1[复制]

100

例子输出1[复制]

67

限制

OIBH在6s内就会发现,所以每一个点仅仅有1s时间给你

提示

简单数学题哦~~

来源

From 玛维-影之歌;
感谢vijos的朋友提供数据

对于long long 的数据我们无法用遍历的方法去做仅仅能通过写出关于n的方程组解决这个问题

通过题目我们能够发现

假设我去51-100中的50个人。肯定是符合条件的

我再去13 - 24中的13个人还是符合条件的,如此,不断的递推下去。将全部符合条件的数目加起来就能够了


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def fun(n):
    if n == 1:return 1
    if n == 0:return 0
    ans = fun(n / 2 / 2)
    ans += n - n / 2
    return ans
import math
n = int(raw_input())
print fun(n)
        


转载于:https://www.cnblogs.com/lytwajue/p/7074150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值