P4127 [AHOI2009]同类分布
Posted edsheeran
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4127 [AHOI2009]同类分布相关的知识,希望对你有一定的参考价值。
链接:https://www.luogu.org/problemnew/show/P4127
题目描述
给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数。
输入输出格式
输入格式:
一行,两个整数 aa 和 bb
输出格式:
一个整数,表示答案
输入输出样例
说明
对于所有的数据, 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 7000000000000 int 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; }
以上是关于P4127 [AHOI2009]同类分布的主要内容,如果未能解决你的问题,请参考以下文章
luogu P4127 [AHOI2009]同类分布 数位dp
luogu P4127 [AHOI2009]同类分布 数位dp