题目链接: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;
}