本文主要是介绍双城记 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;
}
这篇关于双城记 A Tale of Two Cities的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!