f(2n) = 3 * f(n)
f(2n+1) = 3 * f(n) + 1
i的二进制为f[i]三进制各位权值
数位统计
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[63][65550];
ll n;
int k;
int x;
int main()
{
//freopen("in.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
scanf("%lld %d",&n,&k);
int bit[62];
for (int i=60;i>=0;i--)
{
bit[i]=n%2;
n/=2;
}
int I;
memset(dp,0,sizeof(dp));
for (int i=0;i<=60;i++)
{
if(bit[i]==1)
{
dp[i][1]=1;
I=i;
break;
}
}
x=0;
for (int i=I;i<=59;i++)
{
dp[i+1][1]=1;
x=(x*3+bit[i])%k;
for (int j=0;j<k;j++)
{
dp[i+1][j*3%k]+=dp[i][j];
dp[i+1][(j*3+1)%k]+=dp[i][j];
}
if (!bit[i+1])
dp[i+1][(x*3+1)%k]--;
}
ll re=0;
for (int i=0;i<k;i++)
re^=dp[60][i];
cout<<re<<endl;
}
return 0;
}