双城记 A Tale of Two Cities

                       双城记 A Tale of Two Cities

帮助Tom和Jerry解决了问题后,它们愉快的带着crazygirl来到了双城。
双城虽说是叫双城,但是其实只是一座被一条河流分成东西两半的城市。
双城的户籍系统很神奇。每一个人都有一个不重复编号。每出生一个人,这个人的标号就会变为原先的最大标号加一。每过世一个人,如果生前他的标号不是最大的,当前标号最大的人的标号就会变为逝者的标号。这样,双城所有居民的标号就始终恰好为1-n。另外双城城主不需要户籍,因此没有标号。
住在河流之上的悬浮花园的双城城主很喜欢2这个数字。于是下令,所有住在东边的居民,如果标号为自己2倍再加2的人没有住在西边或者是干脆不存在,那么他必须搬出去;所有住在西边的居民,如果没有任何一个住在东边的居民标号乘2再加2等于他的标号,他也必须搬出城。
这个命令一下,所有的居民顿时叫苦不迭。他们听说crazygirl刚刚解决了Tom和Jerry的他们都不会的问题,于是乎请求crazygirl帮忙重新安排他们的住宿方案,使得能够住在城里的人尽量多。

输入格式:

一行一个整数n

输出格式:

一行一个整数表示居住在城内的最大人数

样例输入:

10

样例输出:

6

数据范围:

对于10%的数据 1 <= n <= 10
对于30%的数据 1 <= n <= 1000
对于80%的数据 1 <= n <= 10^18
对于90%的数据 1 <= n <= 10^1000
对于100%的数据 1 <= n <= 10^10000

时间限制:

1s

空间限制:

256M

提示:

remove!!!

我们对于这些数处理成一条条链,然后每次计算除去最后一个点(最后一条边)的剩余链上边数,然后显然一个取,一个不取,所以就容斥一下,就可以过了。加个高精

我们知道前面见后面为该层边的边数,所以并非容斥原理就可以A

#include<bits/stdc++.h>
using  namespace  std;
long  long  n,ans,p;
int  main()
{
     cin>>n;
     p=-1;
     while (n=(n-2)/2)
     {
         if (n<0)  break ;
         p=-p;
         ans+=p*n;
     }
     cout<<ans*2;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值