hihoCoder 1259 A Math Problem 数位dp

来源:互联网 发布:蚁群算法原理怎么改进 编辑:程序博客网 时间:2024/06/11 20:17

f(2n) = 3 * f(n)

f(2n+1) = 3 * f(n) + 1

i的二进制为f[i]三进制各位权值

数位统计


#include <bits/stdc++.h>#define ll long longusing 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;}


0 0