-
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; }
D - Count The Bits Gym - 101982D -数位DP
最新推荐文章于 2020-10-06 15:51:50 发布