5710 Digit-Sum(找规律)

Digit-Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 53    Accepted Submission(s): 22


Problem Description
Let  S(N) be digit-sum of  N, i.e  S(109)=10,S(6)=6.

If two positive integers  a,b are given, find the least positive integer  n satisfying the condition  a×S(n)=b×S(2n).

If there is no such number then output 0.
 

Input
The first line contains the number of test caces  T(T10).
The next  T lines contain two positive integers  a,b(0<a,b<101).
 

Output
Output the answer in a new line for each test case.
 

Sample Input
 
  
3 2 1 4 1 3 4
 

Sample Output
 
  
1 0 55899

solution:

我们发现,如果一个digit是0~4,那么*2的效益是完全获得的。 如果一个digit的是5~9,那么*2后会损失9的收益。 这里解释一下为什么会损失9的收益 对于digit是5~9的,*2之后会变成两位,即10+x,而计算S(n)的时候,10只能被记为1,故损失了9 a*S(n) == b*S(2n), 我们假设有l的长度是[0,4]范围,有L的长度是[5,9]范围 那么显然满足: S(2n)=S(n)*2-L*9 替换一下—— a*S(n) == b*(2S(n)-L*9) a*S(n) == 2b*S(n) -L*9*b (2b-a)*S(n) == L*9*b 即—— 9*b:2b-a = S(n):L 也就是说,我们得到了S(n)与L的比例关系。 然后模拟一遍即可。 怎么模拟呢? 我们不妨假设答案n仅有长度为L,且每一位都是5 然后得到了把数位和sum分撒出去。 对于sum余下的数值,我们依次加到尾巴上。 如果sum最后把长度为L的字串都填充为'9'之后,还有剩余,那么在前面贪心填充。

#include<cstdio>
#include<algorithm>
using namespace std;
int num[150];
int gcd(int a, int b)
{
    if (b ==0)return a;
    return gcd(b, a%b);
}
int main()
{
    int t, a, b;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &a, &b);
        int x = 2 * b - a, y = 9 * b;
        if (x < 0||y<5*x)printf("0\n");
        else if (x == 0)printf("1\n");
        else {
            int z = gcd(x, y);
            x /= z; y /= z;
            if (y > 9 * x)
            {
                int x1 = (y - 9 * x) % 4, x2 = (y - 9 * x) / 4;
                if (x1)printf("%d", x1);
                for (int i = 0; i < x2; i++)
                    printf("4");
                y = 9 * x;
            }
            y -= 5 * x;
            int len;
            for (len = 0;len<x; len++)
            {
                z = min(y, 4);
                num[len] = 5 + z;
                y -= z;
            }
            for (int i = len - 1; i>= 0; i--)
                printf("%d", num[i]);
            printf("\n");
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_22522375/article/details/51628277