永恒之2
Smiling & Weeping
---- 鱼说,你看不到我眼中的泪,
因为我在水里。
水说,我能感觉到你的泪,
因为你在我的心里。
思路:其实题目说的很明白这道题目就是一道数位DP,把十进制改成十六进制,计算出现过多少次二
吐槽:全天人不在线,迷惑性bug层出不穷,还是要认真演算程序框架思路啊,[○・`Д´・ ○]
Talk is cheap , show me the code
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int mode = 99999989; 5 const int maxn = 200; 6 ll dp[maxn][maxn]; 7 char ch[maxn]; 8 map<char , int> num1; 9 int num[maxn]; 10 ll dfs(int pos , int sum , bool lead , bool limit) 11 { 12 ll ans = 0; 13 if(pos == 0) return sum; 14 if(!lead && !limit && dp[pos][sum] != -1) return dp[pos][sum]; 15 int up = (limit ? num[pos] : 15); 16 for(int i = 0; i <= up; i++) 17 { 18 if(i == 0 && lead) ans += dfs(pos-1 , sum , true , limit&& i == up) , ans %= mode; 19 else if(i == 2) ans += dfs(pos-1 , sum+1 , false , limit&& i == up) , ans %= mode; 20 else if(i != 2) ans += dfs(pos-1 , sum , false , limit&& i == up) , ans %= mode; 21 } 22 if(!lead && !limit) dp[pos][sum] = ans%mode; 23 return ans%mode; 24 } 25 inline int read_occ(char c) 26 { 27 if(isdigit(c)) 28 return c-'0'; 29 else 30 return c-'A'+10; 31 } 32 ll solve(ll a) 33 { 34 int len = a; 35 for(int i = a; i >= 1; i--) 36 num[i] = read_occ(ch[i]); 37 for(int i = 1; i <= a; i++) 38 cout << num[i] << " "; 39 memset(dp , -1 , sizeof(dp)); 40 return dfs(len , 0 , true , true )%mode; 41 } 42 int main() 43 { 44 ll a , ans=0; 45 scanf("%lld",&a); 46 scanf("%s",ch+1); 47 ch[0] = 0; 48 printf("%s",ch); 49 ans = solve(a); 50 printf("%lld\n",ans); 51 return 0; 52 }
代码有些乱,还请见谅,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
青山不改,绿水长流,文章到此结束,我们下次再见。