Codeforces Round #631 (Div. 2) D
dp 不错
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int dig[40],m;
ll dp[40];
ll pow2[40];
int main()
{
int t;
cin>>t;
pow2[1]=1;
for(int i=2;i<=38;i++)pow2[i]=pow2[i-1]*2;
while(t--){
int d,m;
cin>>d>>m;
int len=0;
int x=d;
while(x){
len++;
x>>=1;
}
dp[0]=1;
for(int i=1;i<len;i++){
dp[i]=dp[i-1];
dp[i]=(dp[i]+pow2[i]*dp[i-1]%m)%m;
}
dp[len]=dp[len-1];
dp[len]=(dp[len]+(d-pow2[len]+1)*dp[len-1]%m)%m;
cout<<(dp[len]-1+m)%m<<endl;
}
}