首页 > 代码库 > uva11361数位dp
uva11361数位dp
挺裸的 ,只要注意到当k超过9*10 就直接输出0就可以了。
#include <cstdio>#include <cstring>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <map>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>#include <math.h>using namespace std;typedef long long LL;LL dp[15][150][150];LL k;LL path[1000];LL gao(LL x, LL sum, LL mod, LL flag){ if (~dp[x][sum][mod]&&!flag) return dp[x][sum][mod]; if (x == 0){ if (sum%k == 0 && mod == 0) return 1; else return 0; } LL bound = flag ? path[x] : 9; LL ans = 0; for (LL i = 0; i <= bound; i++){ // if((mod* 10+ i ) % k > 100) continue; ans += gao(x - 1, sum + i, (mod * 10 + i) % k, flag && (i == bound)); } return flag?ans : dp[x][sum][mod] = ans;}LL solve(LL x){ LL ret = 0; while (x){ path[++ret] = x % 10; x /= 10; } return gao(ret, 0, 0, 1);}int main(){ LL a, b; LL Icase; cin >> Icase; while (Icase--){ cin >> a >> b >> k; if(k>90){ cout<<0<<endl; continue; } memset(dp,-1,sizeof(dp)); cout << solve(b) - solve(a - 1) << endl; } return 0;}
uva11361数位dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。