D - Count The Bits Gym - 101982D -数位DP

  • D - Count The Bits

  •  Gym - 101982D 
  • 统计 0-2^b -1  之间这些数中,能整除k的数,的二进制位上1的个数和
  • 思路:先说一下dp的含义:dp[数位][余数][1的个数],与普通的数位DP相同求边界开始记忆化递归
  • 由于 这个题的最高位就是2^b -1 ,二进制每一位上都是1,所以边界数组省去,直接用1来判断,就是这么简单.
  • #include<bits/stdc++.h>
    using namespace std;
    #define mod 1000000009
    #define ll long long
    int  dp[130][1010][130],ans;
    int n,k;
    ll dfs(int cur,int md,bool flag,int  ss)
    {
        if(cur<0)return md==0?ss%mod:0;
        if(!flag&&dp[cur][md][ss]!=-1)return (dp[cur][md][ss])%mod;
        int sum=0;
        for(int i=0; i<=1; i++)
            sum=(sum+dfs(cur-1,(md*2+i)%k,flag&&i==1,i==1?(ss+1)%mod:ss%mod))%mod;
        dp[cur][md][ss]=sum;
        return sum;
    }
    void solve()
    {
        ans=dfs(n-1,0,true,0);
        printf("%d\n",ans);
    }
    int main()
    {
        memset(dp,-1,sizeof(dp));
        scanf("%d%d",&k,&n);
        solve();
        return 0;
    }
  •  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值