http://poj.org/problem?id=2309
//找规律 可以看到每个根节点都可以将其在同一层的最左边的根节点整除,并且最大值为该节点加上最左边的节点值-1,最小值为为该节点减去最左边的节点值-1
1 #include <iostream> 2 #include<cmath> 3 using namespace std; 4 5 int main() 6 { 7 long long s[35]; 8 s[0] =1; 9 for(int i=1;i<=31;i++) 10 s[i] = s[i-1]<<1; 11 int t,n; 12 cin>>t; 13 while(t--){ 14 cin>>n; 15 if(n%2){ 16 cout<<n<<" "<<n<<endl; 17 continue; 18 } 19 int j; 20 for(j=31;j>=0;j--) 21 if(n%s[j]==0) 22 break; 23 int bet = s[j]-1; 24 cout<<n-bet<<" "<<n+bet<<endl; 25 26 } 27 return 0; 28 }