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;
    }
  •  

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/84660717