time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Dreamoon likes sequences very much. So he created a problem about the sequence that you can't find in OEIS:
You are given two integers d,md,m, find the number of arrays aa, satisfying the following constraints:
- The length of aa is nn, n≥1n≥1
- 1≤a1<a2<⋯<an≤d1≤a1<a2<⋯<an≤d
- Define an array bb of length nn as follows: b1=a1b1=a1, ∀i>1,bi=bi−1⊕ai∀i>1,bi=bi−1⊕ai, where ⊕⊕ is the bitwise exclusive-or (xor). After constructing an array bb, the constraint b1<b2<⋯<bn−1<bnb1<b2<⋯<bn−1<bn should hold.
Since the number of possible arrays may be too large, you need to find the answer modulo mm.
Input
The first line contains an integer tt (1≤t≤1001≤t≤100) denoting the number of test cases in the input.
Each of the next tt lines contains two integers d,md,m (1≤d,m≤1091≤d,m≤109).
Note that mm is not necessary the prime!
Output
For each test case, print the number of arrays aa, satisfying all given constrains, modulo mm.
Example
input
Copy
10 1 1000000000 2 999999999 3 99999998 4 9999997 5 999996 6 99995 7 9994 8 993 9 92 10 1
output
Copy
1 3 5 11 17 23 29 59 89 0
题意:给你一个数n(<=1e9)和模数mod(<=1e9),对于一个序列,若这个序列是严格递增的,且最大的数不超过n,且它的前缀异或值也是递增的,那么这个序列就是合法序列。T组数据,每组n和m,输出n相应的合法的序列总数%mod。
思路:直接打表,规律很明显。(代码中附打表代码)注意取模!注意取模!注意取模!!!!!!!!
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
using namespace std;
const int maxn=400010;
int m,q,k,ct;
ll n,mo;
int a[maxn];
void dfs(int x,int xr){
a[x]++;
for(int i=x+1;i<=20;i++){
if((xr^i)>xr) dfs(i,xr^i);
}
}
int main()
{
//下面这段是打表代码
/*dfs(0,0);
rep(i,1,20)
{
if(i>1)a[i]+=a[i-1];
cout<<i<<" "<<a[i]<<" "<<a[i]-a[i-1]<<endl;
}*/
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&mo);
ll i=1,sum=1,k=1,num=1;
while(i<n){
k=k*(num+1)%mo;
num<<=1;
if(i+num>=n) {sum=(sum+(n-i)*k%mo)%mo;break;}
else {i+=num;sum=(sum+num*k%mo)%mo;}
}
printf("%lld\n",sum%mo);
}
return 0;
}