LightOJ 1140 How Many Zeroes?

来源:互联网 发布:aspen plus软件 编辑:程序博客网 时间:2024/05/01 06:10

简单数位DP,不知道这个OJ是支持long long 还是_int64,50%的概率啊,,竟然选错了。一直wrong啊,好苦逼。

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <queue>#include <stack>#include <algorithm>#include <map>#include <vector>#include <cmath>#include <stack>using namespace std;#define ll long long#define int64 __int64#define M 50005#define N 1005#define inf 1000010#define mod 1000000009int dig[55];ll dp[55][2] , table[55];ll Dfs(int index , int fg , int lim){if (!index)return !fg;if (!lim && dp[index][fg] != -1)return dp[index][fg];int i , up = lim ? dig[index] : 9;ll ret = 0;for (i = 0 ; i <= up ; i++){if (fg && i == 0){if (!(lim&&i==up))ret += table[index-1]+Dfs(index-1 , 1 , 0);else {int j ;ll temp = 0;for (j = index-1 ; j > 0 ; j--)temp = temp*10+dig[j];temp++;ret += temp+Dfs(index-1 , 1 , 1);}}elseret += Dfs(index-1 , fg||i!=0 , lim&&i==up);}if (!lim)dp[index][fg] = ret;return ret;}ll Solve(ll k){if (k < 0)return 0;int len = 0;while (k){dig[++len] = k%10;k /= 10;}return Dfs(len , 0 , 1);}int main(){ll m , n;int i , t , tcase = 1;scanf("%d",&t);memset(dp , -1 , sizeof dp);table[0] = 1;for (i = 1 ; i <= 25 ; i++)table[i] = table[i-1]*10;while (t--){scanf("%lld%lld",&m,&n);printf("Case %d: %lld\n",tcase++,Solve(n)-Solve(m-1));}return 0;}