1. 程式人生 > >D - Count The Bits Gym - 101982D -數位DP

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