https://codeforces.com/problemset/problem/1329/B
思路:
虽然出题人说oeis找不到,但是还是打表试试嘛
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL ans=0;
LL c[maxn],tot=0;
LL cnt[maxn];
void dfs(LL lasta,LL lastb,LL d){
for(LL i=1;i<=d;i++){///枚举当前a选择
if(i<=lasta) continue;
LL nowb=i^lastb;
if(nowb>lastb){
ans++;
dfs(i,nowb,d);
}
}
}
int main(void)
{
LL T=70;//T=read();
for(LL d=1;d<=T;d++){
ans=0;
dfs(0,0,d);
printf("%lld ",ans);
c[++tot]=ans;
}
printf("\n");
for(LL i=1;i<tot;i++){
cnt[i]=c[i+1]-c[i];
}
for(LL i=1;i<tot;i++){
printf("%lld ",cnt[i]);
}
printf("\n");
return 0;
}
于是就在log的范围内处理一个递推
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL t;cin>>t;
while(t--){
LL d,m;cin>>d>>m;
LL ans=0;LL tmp=1;
for(LL i=1;i<=32;i++){
if(d< ( (1LL<<i) )){
ans+=(d- ( 1LL<<(i-1) )+1 )*tmp;
ans%=m;
break;
}
else{
ans+=( 1LL<<(i-1) )*tmp;
ans%=m;
tmp*= ( (1LL<<(i-1))+1 );
tmp%=m;
}
}
cout<<ans<<"\n";
}
return 0;
}