题解 P6356 [COCI2007-2008#3] CUDAK
水道简单题的题解。
传送门。
分析
首先从数据范围出发 \(1\le A,B\le 10^{15}\),并且提问方式 $\left [ A,B \right ] $ 可以发现,这就是一道数位 dp 的题目。
接着看数位 dp 的满足条件,和一定,那就更加确信是一道数位 dp 了。
至于第二问,我们可以通过二分答案来解决,答案是最早的到 \(A\) 中和为 \(S\) 的点。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e2+5;
int n, m,sum,L,R;
int f[N][N],num[N];
inline int dfs(int now,int tot,int flag) {
if(!flag&&~f[now][tot]) return f[now][tot];
if(tot>sum) return 0;
if(now==0) return tot==sum;
int res=0,up=flag?num[now]:9;
for(int i=0;i<=up;++i) res+=dfs(now-1,tot+i,flag&&(i==num[now]));
if(!flag) f[now][tot]=res;
return res;
}
inline int query(int x) {
int cnt=0;
while(x) {
num[++cnt]=x%10;
x/=10;
}
return dfs(cnt,0,1);
}
signed main() {
cin>>L>>R>>sum;
memset(f,-1,sizeof f);
cout<<query(R)-query(L-1)<<"\n";
int l=L,r=R,res=0,x=query(L-1);
while(l<=r) {
int mid=l+r>>1;
if(query(mid)==x) l=mid+1;
else r=mid-1,res=mid;
}
cout<<res<<"\n";
return 0;
}

浙公网安备 33010602011771号