HDU - 5710—— Digit-Sum

Sample Input

3
2 1
4 1
3 4

Sample Output

1
0
55899
 

需要注意,当 a>2×b以及 5×a<b时,不可构造,输出 

#include <bits/stdc++.h>  
  
typedef long long LL;  
using namespace std;  
  
int GCD(int a,int b)
{
	if(b == 0)  return a;
	else GCD(b, a % b);
}
int t;  
int a, b;  
int ans[10000];//wa了好几次发现结果数组开小了  
int main()  
{  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d %d",&a,&b);  
        memset(ans,0,sizeof(ans));  
        if(2 * b < a|| 5 * a < b) //特殊处理  
            printf("0\n");  
        else   
        {  
        int l = 2 * b - a;  
        int sn = 9 * b;  
        int x = GCD(l, sn);  
       l /= x,   sn /= x;  
        for(int i = 1;i <= l;i++)//>=5的只有l个  
                ans[i] = 5;  
                sn -= (5*l);  
        int k = l;  
        for(int i = 1;i <= l;i++)  
        {  
            int v = min(sn ,4);  
            ans[i] += v;  
            sn -= v;  
        }  
        while(sn)//l全为9后sn还剩余则加到l个外面  
        {  
            int v = min(sn ,4);  
            ans[++k] += v;  
            sn -= v;  
        }  
        for(int i = k;i > 0;i--)//倒着输出  
        {  
            printf("%d",ans[i]);  
        }  
        printf("\n");  
        }  
    }  
}	if(b == 0)  return a;
	else GCD(b, a % b);
}
int t;  
int a, b;  
int ans[10000];//wa了好几次发现结果数组开小了  
int main()  
{  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d %d",&a,&b);  
        memset(ans,0,sizeof(ans));  
        if(2 * b < a|| 5 * a < b) //特殊处理  
            printf("0\n");  
        else   
        {  
        int l = 2 * b - a;  
        int sn = 9 * b;  
        int x = GCD(l, sn);  
       l /= x,   sn /= x;  
        for(int i = 1;i <= l;i++)//>=5的只有l个  
                ans[i] = 5;  
                sn -= (5*l);  
        int k = l;  
        for(int i = 1;i <= l;i++)  
        {  
            int v = min(sn ,4);  
            ans[i] += v;  
            sn -= v;  
        }  
        while(sn)//l全为9后sn还剩余则加到l个外面  
        {  
            int v = min(sn ,4);  
            ans[++k] += v;  
            sn -= v;  
        }  
        for(int i = k;i > 0;i--)//倒着输出  
        {  
            printf("%d",ans[i]);  
        }  
        printf("\n");  
        }  
    }  
}

需要注意,当 a>2×ba>2×b 以及 5×a<b5×a<b 时,不可构造,输出 

猜你喜欢

转载自blog.csdn.net/strawberry_595/article/details/80378370