传送门

因 为 b [ i ] 要 递 增 , 所 以 每 次 和 a [ i ] 异 或 后 一 定 变 大 因为b[i]要递增,所以每次和a[i]异或后一定变大 b[i],a[i]

所 以 对 a 数 组 而 言 : 第 i 个 数 的 最 高 二 进 制 一 定 高 于 第 i − 1 个 数 所以对a数组而言:第i个数的最高二进制一定高于第i-1个数 a:ii1

否 则 会 把 i − 1 个 数 的 最 高 位 1 搞 没 否则会把i-1个数的最高位1搞没 i11

所 以 对 于 d = 15 , 可 以 把 数 字 分 类 , 一 个 集 合 最 多 选 一 个 所以对于d=15,可以把数字分类,一个集合最多选一个 d=15,

( 1 ) ( 2 , 3 ) ( 4 , 5 , 6 , 7 ) ( 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ) (1)(2,3)(4,5,6,7)(8,9,10,11,12,13,14,15) (1)(2,3)(4,5,6,7)(8,9,10,11,12,13,14,15)

第 i 位 有 2 i + 1 − 1 种 选 法 ( i + 1 个 位 置 填 01 ) 第i位有2^{i+1}-1种选法(i+1个位置填01) i2i+11(i+101)

减 去 不 合 法 的 选 法 2 i − 1 减去不合法的选法2^{i}-1 2i1

加 上 1 得 到 第 i 位 的 最 终 选 法 ( 可 以 不 选 这 一 位 ) 加上1得到第i位的最终选法(可以不选这一位) 1i()

然 后 答 案 累 乘 减 1 , 减 的 是 什 么 都 不 选 的 选 法 ( n > = 1 ) 然后答案累乘减1,减的是什么都不选的选法(n>=1) 1(n>=1)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,mod;
		cin>>n>>mod;
		ll ans=1;
		for(int i=0;i<30;i++)
		{
			if((1<<i)>n)	break;
			int k=min( (1<<(i+1))-1,n ) - (1<<i)+2;
			//取min,因为最高位可能取不满 
			//如n=6,取不到7 
			ans=ans*k%mod;
		}
		ans=(ans+mod-1)%mod;
		cout<<ans<<endl;
	}
}