因 为 b [ i ] 要 递 增 , 所 以 每 次 和 a [ i ] 异 或 后 一 定 变 大 因为b[i]要递增,所以每次和a[i]异或后一定变大 因为b[i]要递增,所以每次和a[i]异或后一定变大
所 以 对 a 数 组 而 言 : 第 i 个 数 的 最 高 二 进 制 一 定 高 于 第 i − 1 个 数 所以对a数组而言:第i个数的最高二进制一定高于第i-1个数 所以对a数组而言:第i个数的最高二进制一定高于第i−1个数
否 则 会 把 i − 1 个 数 的 最 高 位 1 搞 没 否则会把i-1个数的最高位1搞没 否则会把i−1个数的最高位1搞没
所 以 对 于 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) 第i位有2i+1−1种选法(i+1个位置填01)
减 去 不 合 法 的 选 法 2 i − 1 减去不合法的选法2^{i}-1 减去不合法的选法2i−1
加 上 1 得 到 第 i 位 的 最 终 选 法 ( 可 以 不 选 这 一 位 ) 加上1得到第i位的最终选法(可以不选这一位) 加上1得到第i位的最终选法(可以不选这一位)
然 后 答 案 累 乘 减 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;
}
}