列表

详情


NC19888. [AHOI2009]SELF 同类分布

描述

给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。

输入描述

输入a,b

输出描述

输出[a,b]中各位数字之和能整除原数的数的个数

示例1

输入:

10 19

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 576ms, 内存消耗: 6908K, 提交时间: 2019-04-20 11:56:32

#include<iostream>
#include<cstdio>
#define N 165
#define ll long long
using namespace std;

int mod,tot,cnt,a[25],mark[2][25][N][N]; ll f[2][25][N][N];
ll dp(int p,int d,int s,int v){
	if (!d) return !s && !v;
	if (mark[p][d][s][v]==tot) return f[p][d][s][v];
	mark[p][d][s][v]=tot; ll t=0;
	int i,l=max(0,s-(d-1)*9),r=min((p)?9:a[d],s);
	for (i=l; i<=r; i++) t+=dp(p|(i<a[d]),d-1,s-i,(v*10+i)%mod);
	return f[p][d][s][v]=t;
}
ll solve(ll x){
	ll t=0;
	for (cnt=0; x; x/=10) a[++cnt]=x%10;
	for (mod=1; mod<=cnt*9; mod++){
		tot++; t+=dp(0,cnt,mod,0);
	}
	return t;
}
int main(){
	ll x,y; scanf("%lld%lld",&x,&y);
	printf("%lld\n",solve(y)-solve(x-1));
	return 0;
}

上一题