D - Count The Bits Gym - 101982D -數位DP
阿新 • • 發佈:2018-12-01
-
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; }