不卡单 log 这一块
lizihan250 · · 题解
我还寻思这题怎么是个 *2400 呢,合着我的做法就不是预期解啊。
注意到
对于
因此,考虑从低到高讨论每一位。每一位最多有
对于
对于后面的位置,若
记
时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int Maxw=63,mod=1000000007;
int T;
long long m;
long long dp[Maxw+3][3],ans;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--)
{
cin>>m;
if(m==1)
{
cout<<1<<"\n";
continue;
}
dp[0][0]=1;
if((m>>1)&1) dp[1][0]=2,dp[1][1]=0,dp[1][2]=0;
else dp[1][0]=1,dp[1][1]=1,dp[1][2]=0;
ans=dp[1][0];
for(int i=2;(1ll<<i)<=m;i++)
{
if((m>>i)&1)
{
dp[i][0]=(dp[i-1][0]*3+dp[i-1][1])%mod;
dp[i][1]=(dp[i-1][0]+dp[i-1][1]*3+dp[i-1][2]*3)%mod;
dp[i][2]=dp[i-1][2];
}
else
{
dp[i][0]=dp[i-1][0];
dp[i][1]=(dp[i-1][0]*3+dp[i-1][1]*3+dp[i-1][2])%mod;
dp[i][2]=(dp[i-1][1]+dp[i-1][2]*3)%mod;
}
ans=dp[i][0];
}
cout<<ans<<"\n";
}
return 0;
}