Test instructions slightly;
First, violence, the rules of the table discovery
N=1 Ans=1
n=2 ans=2
N=3 ans=2
N=4 ans=4
N=5 ans=2
N=6 ans=4
N=7 ans=6
N=8 ans=8
N=9 ans=2
n=10 ans=4
N=11 ans=6
N=12 ans=8
N=13 ans=10
N=14 ans=12
N=15 ans=14
N=16 ans=16
N=17 ans=2
N=18 ans=4
N=19 ans=6
N=20 ans=8
N=21 ans=10
N=22 ans=12
N=23 ans=14
N=24 ans=16
N=25 ans=18
N=26 ans=20
N=27 ans=22
N=28 ans=24
n=29 ans=26
N=30 ans=28
N=31 ans=30
N=32 ans=32
This rule is very obvious, just a little bit. directly on the code.
#include <map>#include<Set>#include<list>#include<cmath>#include<ctime>#include<deque>#include<stack>#include<queue>#include<cctype>#include<cstdio>#include<string>#include<vector>#include<climits>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#defineLL Long Long#definePI 3.1415926535897932626using namespacestd;intgcdintAintb) {returnA% b = =0? B:GCD (b, a%b);}#defineMAXN 500003Vector<int>tab[ -];intnum[ -];intN;voidinit () { for(intI=0;i< -; i++) tab[i].clear (); tab[0].push_back (1); for(intI=1;i< -; i++) { intlimit=1<<i; intcas=2; while(cas<=limit) {Tab[i].push_back (CAS); CAS+=2; }} num[0]=1; for(intI=1;i< -; i++) num[i]=num[i-1]+tab[i].size ();}intMain () {init (); while(SCANF ("%d", &n)! =EOF) { if(n==0) Break; if(n==1) {puts ("1");Continue;} intcas=0, I; for(i=0;i< -; i++) {CAs+=tab[i].size (); if(cas>=n) Break; } inttmp=n-num[i-1]; printf ("%d\n", tab[i][tmp-1]); } return 0;}
UVA 10940 throwing cards away II