题目链接
题目大意
给你d和m,构造一个数组a,使得a严格递增,使数组b( b 1 = a 1 , ∀ i > 1 , b i = b i − 1 ⊕ a i b_1=a_1, ∀i>1,b_i=b_{i−1}⊕ai b1=a1,∀i>1,bi=bi−1⊕ai)递增,问你构成a有几种可能,答案模上m
题目思路
这个题目主要是有两个关键点,一个要明白 a i a_i ai化为2进制1的最高位一定比 a i − 1 a_{i-1} ai−1高,还有就是组合数学的计算要理清,标称很好的解释了就不多说了
代码
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define debug printf("I am here\n");
using namespace std;
typedef long long ll;
const int maxn=2e5+5,mod=998244353;
int t,d,m;
signed main(){
scanf("%d",&t);
while(t--){
ll ans=1;
scanf("%d%d",&d,&m);
for(int i=0;i<=30;i++){
if(d<(1<<i)) break;
ans=ans*(min(d,(1<<(i+1))-1)-(1<<i)+2)%m;
}
ans=(ans-1+m)%m;
printf("%lld\n",ans);
}
return 0;
}