|  | 
				
					
	
		
		
		 #include <iostream> 
  using namespace std; 
  
  const int maxn=1005; 
  __int64 n,m; 
  __int64 F[maxn]; 
  int c[maxn][maxn]; 
  
  int cal(int n) 
    { 
  int t = 1; 
  while (t <= n) t = t * 2 + 1; 
  t = (t - 1) / 2; 
  t = (t - 1) / 2; 
  int sum = n - 1 - t; 
   if (sum > 2 * t + 1)  { 
  sum = 2 * t + 1; 
  } 
  return sum; 
  } 
  
   void calc_c()  { 
  for (int i = 0; i < maxn; i++) 
     { 
  c[i][0] = c[i][i] = 1; 
  for (int j = 1; j < i; j++) 
     { 
  c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % m; 
  } 
  } 
  } 
  
  __int64 slove(int n) 
    { 
  if(F[n]) 
  return F[n]; 
  if(n==0||n==1) 
  return 1; 
  int left=cal(n); 
  int right=(n-1)-left; 
  return F[n]=( (slove(left)*slove(right) )%m )*(__int64)c[n-1][left]%m; 
  } 
  int main() 
    { 
  int T; 
  scanf("%d",&T); 
  while(T--) 
     { 
  memset(F,0,sizeof(F)); 
  scanf("%I64d%I64d",&n,&m); 
  calc_c(); 
  __int64 ans=slove(n); 
  printf("%I64d\n",ans); 
  } 
  return 0; 
  }   |