D. Dreamoon le gustan las secuencias -------------------- Pensamiento

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
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;
	}
}

572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105327991
Recomendado
Clasificación