题目链接:https://vjudge.net/problem/HDU-5710

 

解题思路:

如果某位上是5-9的,那么这个数乘以2就会变小9,因为取到个位再加上十位的一个1。

那么就有:S(2*n) = S(n)*2 - 9*L(L是n有多少位上的数是5-9的数)

带入式子中得到 9*b:2*b-a = S(n):L,将S看做9*b,L看做2*b-a,讨论取值范围。

当L==0时,取n==1

接下来就是贪心做,把大的数放在前面就好,也就是先放L位5-9的数。

#include <bits/stdc++.h>
using namespace std;
int ans[1311];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		int a,b;
		scanf("%d%d",&a,&b);
		int s = 9*b,l = 2*b - a;
		if(l<0){
			puts("0");
			continue;
		}
		int siz = 0 ,g = __gcd(s,l); 
		s /= g,l /= g;
		s -= l*5;
		if(s<0){
			puts("0");
			continue;	
		}
		if(l==0){
			puts("1");
			continue;
		}
		for(int i=0;i<l;i++){
			int mi = min(s,4);
			s -= mi;
			ans[siz++] = 5 + mi;
		}
		while(s){
			int mi = min(s,4);
			s -= mi;
			ans[siz++] = mi;
		}
		for(int i=siz-1;i>=0;i--) printf("%d",ans[i]);
		puts("");
	}
	return 0;
}