Tema: Para
darle d y m, construya una matriz a, de modo que a se incremente, de modo que la matriz b (b1 = a1, ∀i> 1, bi = bi − 1⊕ai) se incremente, pregúntele cuántas posibilidades de formar a, La respuesta es m
Resolución:
1. Generación de b array b [i] = b [i-1] ^ a [i] Si b [i] se incrementa, entonces el primer bit i-1 de a [i-1] es 1, entonces a [i] El i-ésimo bit debe ser 1.
De lo contrario, la matriz b ya no aumenta monotónicamente. Por ejemplo, a [i-1] = 2, luego a [i] = 4 (no puede ser 3, porque se eliminará el 1 más significativo)
2. Así que considere el rango del bit i-ésimo: hay todos 0 ~ 1, luego es 2 (i + 1) -1, y luego restarlo eliminará el bit más alto de 1 y puede ser 2 i -1
3. Entonces el total 2 (i + 1) -1- (2 i -1)
4. También hay una situación en la que no es necesario suponer que d = 9, cada uno de los cuales puede ser 1, 2, 4 u 8 no es necesario. Tomo 1, 2, 8 también es una respuesta. Entonces +1
5. Finalmente: 2 (i + 1) -1- (2 i -1) +1
Nota:
Debido a que existen restricciones en d, es posible que no obtengamos todos los 0 y todos los 1. El rango es min (d, 2 (i + 1) -1)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll a,b;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld %lld",&a,&b);
ll sum=1;
for(int i=0;i<30;i++)
{
ll x=1<<i;
if(a<x) break;
sum=sum*(min((x<<1)-1,a)-x+1+1)%b;
}
cout<<(sum-1+b)%b<<endl;
}
}