[数位DP] hihoCoder#1033 交错和
来源:互联网 发布:9.9元天天特价淘宝童装 编辑:程序博客网 时间:2024/04/29 04:04
hihoCoder#1033
描述
给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数:
f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1
例如:
f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4
给定
输入
输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100)。
输出
输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7。
解法
数位DP。 DP[i][j][k] 表示当前处理到i位,当前交错和为j-100,k表示下一个符号是正还是负。所有交错和+100是为了避免负数爆数组。依然使用模板进行记忆化搜索。
因为是求和,所以把DP开成结构体了,以前都是求个数,现在求和也不难。
知道当前的pos位置,也知道当前位置放的哪个数,有多少个数含有这个数,利用同余关系就可以求和了。
#include<bits/stdc++.h>#define ll long long intusing namespace std;const ll mod = 1e9+7;ll a, b, K;ll fac[25];int num[25];struct node{ ll n, sum; node(){ n = sum = 0; }}dp[25][800][2][2];bool cg(int x){ return x > 0;}node dfs(int pos, int k, int flag, int zr, int f){ // k为当前交错和 flag为正负号 zr控制前导0,这题需要考虑前导零 if(pos < 1){ node tmp; if(k == 100) tmp.n = 1; return tmp; } if(!f && dp[pos][k][cg(flag)][zr].sum != -1) return dp[pos][k][cg(flag)][zr]; node res, tmp; int end = f? num[pos] : 9; for(int i = 0; i <= end; ++i){ if(i == 0){ if(zr) tmp = dfs(pos-1, k, flag, zr, f && i == end); else tmp = dfs(pos-1, k, -flag, zr, f && i == end); } else tmp = dfs(pos-1, k+flag*i, -flag, 0, f && i == end); res.n += tmp.n; res.sum += tmp.sum + fac[pos]*i*tmp.n; if(res.n >= mod) res.n %= mod; if(res.sum >= mod) res.sum %= mod; } if(!f) dp[pos][k][cg(flag)][zr] = res; return res;}ll solve(ll n){ memset(dp, -1, sizeof(dp)); int len = 0; while(n){ num[++len] = n%10; n /= 10; } return dfs(len, K+100, -1, 1, 1).sum;}void init(){ fac[1] = 1; for(int i = 2; i <= 20; ++i) fac[i] = (fac[i-1]*10)%mod;}int main(){ init(); scanf("%lld%lld%lld", &a, &b, &K); printf("%lld\n", (solve(b)-solve(a-1)+mod)%mod);}
0 0
- 数位DP 浅谈(hihocoder 1033:交错和)
- [数位dp] hihoCoder 1033 交错和
- hihocoder 1033 交错和 数位DP
- [数位DP] hihoCoder#1033 交错和
- 数位DP 浅谈(hihocoder 1033:交错和)
- 数位DP 浅谈(hihocoder 1033:交错和)
- hihoCoder 1033 : 交错和 数位dp
- hihocoder 1033 交错和 (数位dp)
- [hihocoder 1033]交错和 数位dp/记忆化搜索
- hihoCoder 交错和 (数位DP)
- 【数位dp 求满足的值和】hihocoder 1033 交错和
- 浅谈数位DP(以hihocoder #1033 交错和为例)
- hihocoder 1033 交错和
- hihocoder #1033 : 交错和
- hihocoder 1033 交错和
- hihoCoder #1033 : 交错和
- HihoCoder 1033:交错和
- [hihoCoder]#1033 : 交错和
- xinu在vbox上,使用debian8,并在上面进行xinu编程
- Java 多线程:分析线程池的实现原理
- 找回Python IDLE Shell里的历史命令(用上下键翻历史命令怎么不好用了呢?)
- linux运维路线
- iOS之 TCP socket网络编程 demo
- [数位DP] hihoCoder#1033 交错和
- Android系统镜像改造指南
- Android学习笔记----layout_weight属性解析
- MT模式下静态链接错误的问题
- 高精度 加 减 乘
- linux小学生(一)之 linux简介
- java中的转义字符
- 进程组ID
- mysql explain 执行计划解读