P4127 [AHOI2009]同类分布
生活随笔
收集整理的這篇文章主要介紹了
P4127 [AHOI2009]同类分布
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://www.luogu.org/problemnew/show/P4127
題目描述
給出兩個數?a,ba,b?,求出?[a,b][a,b]?中各位數字之和能整除原數的數的個數。
輸入輸出格式
輸入格式:
?
一行,兩個整數?aa?和?bb
?
輸出格式:
?
一個整數,表示答案
?
輸入輸出樣例
輸入樣例#1:?復制 10 19 輸出樣例#1:?復制 3說明
對于所有的數據,?1 ≤ a ≤ b ≤ 10^18
題解:數位dp, 但有一個問題,我們不知道各個數位數字之和;18*9是很小的,我們枚舉一個一個試就可以了,這次學會了不用存頂上界,特判,情況少
#include<bits/stdc++.h> using namespace std; #define ll long long int digit[20]; ll dp[20][200][2][200]; ll dfs(int dep, int yu, int f, int t, int now, int sum){if(!dep) return !yu && sum == now;if(sum > now || sum + dep * 9 < now)return 0;if(dp[dep][yu][f][sum] != -1)return dp[dep][yu][f][sum];int i = f ? digit[dep] : 9;ll tmp = 0;for(; i >= 0; i--) {tmp += dfs(dep-1, (yu*10 + i) % now, f&(i == digit[dep]), i, now, sum+i);}return dp[dep][yu][f][sum] = tmp; }ll get(ll a){int cnt = 0;int now = 0;while(a){digit[++cnt] = a % 10;a /= 10;now += digit[cnt];}ll ans = 0;for(int i = 1; i <= 9*cnt; i++){memset(dp, -1, sizeof(dp));ans += dfs(cnt, 0, 1, 0, i, 0);} return ans; } // 1000000 7000000000000int main(){int kk = clock();ll L, R;cin>>L>>R;ll ans1 = get(L-1);ll ans2 = get(R);cout<<ans2-ans1<<endl;int cc = clock();//cout<<cc-kk; } View Code?
轉載于:https://www.cnblogs.com/EdSheeran/p/9397195.html
總結
以上是生活随笔為你收集整理的P4127 [AHOI2009]同类分布的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ht-8 对arrayList中的自定
- 下一篇: 浦发银行的信用卡能取现余额吗 其实在申领