双城记 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;}
在一座被河流分为两半的城市中,市长发布了一项关于居民住宿的特殊命令,导致许多居民不得不搬离。为了帮助尽可能多的人留在城市里,crazygirl需要找到一种方法来最大化居住在城内的人数。
587





