别的OJ上都能过啊
查看原帖
别的OJ上都能过啊
247650
thecold楼主2020/9/10 16:51

本代码在Vjudge和Poj均可以通过

下面是源代码

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read()
{
	int res = 0;
	char c;
	bool flag = false;
	c = getchar();
	while(!isdigit(c))
	{
		flag = (c == '-');
		c = getchar();
	}
	while(isdigit(c))
	{
		res = res * 10 + (c ^ 48);
		c = getchar();
	}
	return !flag ? res : -res;
}
typedef long long ll;
int a , b , tot , num[20];
ll ans[10];
inline void split(int x)
{
	tot = 0;
	while(x)
		num[ ++ tot] = x % 10 , x /= 10;
}
struct node{
	ll val , cnt;
	node(ll a , ll b)
	{
		val = a , cnt = b;
	}
	node(){}
}got[10][20];
node dfs(int pos , int nu , bool flag , bool zero)
{
	if(pos <= 0)	return node(0 , 1);
	if(!flag && !zero && got[nu][pos].cnt != -1)	return got[nu][pos];
	node ret = node(0 , 0);
	int maxnum = (flag ? ::num[pos] : 9);
	for(int i = 0 ; i <= maxnum ; ++ i)
	{
		node cat = dfs(pos - 1 , nu , flag && (i == maxnum) , zero && (!i));
		ret.val += cat.val;
		if(!zero || i)	ret.cnt += cat.cnt;
		if((i == nu) && (nu || (!zero && !i)))	ret.val += cat.cnt;	
	}
	return (!flag && !zero) ? got[nu][pos] = ret : ret;
}
int main()
{
	memset(got , -1 , sizeof(got));
	a = read() , b = read();
	if(a > b)	swap(a , b);
	split(b);
	for(int i = 0 ; i <= 9 ; ++ i)
		ans[i] = dfs(tot , i , true , true).val;
	split(a - 1);
	for(int i = 0 ; i <= 9 ; ++ i)
		ans[i] -= dfs(tot , i , true , true).val;
	for(int i = 0 ; i < 9 ; ++ i)
		printf("%lld " , ans[i]);
	printf("%lld" , ans[9]);
	a = read() , b = read();
	while(a || b)
	{
		puts("");
		if(a > b)	swap(a , b);
		split(b);
		for(int i = 0 ; i <= 9 ; ++ i)
			ans[i] = dfs(tot , i , true , true).val;
		split(a - 1);
		for(int i = 0 ; i <= 9 ; ++ i)
			ans[i] -= dfs(tot , i , true , true).val;
		for(int i = 0 ; i < 9 ; ++ i)
			printf("%lld " , ans[i]);
		printf("%lld" , ans[9]);
		a = read() , b = read();
	}
	return 0;
}

我貌似也注意了空格的问题,然而还是有锅,望指正

2020/9/10 16:51
加载中...