HDU 5710 Digit-Sum (数学规律题)

Digit-Sum

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


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
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   6297  6296  6295  6294  6293 

#include<iostream>
#include<algorithm>
#include<string>
#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define maxn 150003
#define ll long long
#define INF 10000000
using namespace std;
int a,b;
int _gcd(int x,int y)
{
    if(y==0) return x;
    return _gcd(y,x%y);
}
/*
典型的数学规律题(我居然有底气说典型)
好吧,,思路还是参考的。
题目大意:对于一个数定义一个函数返回值为其每一位的权重和。
求满足等式a*S(n)=b*S(2*n)的最小n;

打表找规律先,找出S(2*n)和S(n)的关系。。
先考虑其影响因子。。考虑到2为系数,所以大于5的数为一种影响因子。
S(2*n)=S(n)-9*L;其中L为n中大于4的数的个数

于是乎下面就是各种数学化简,对于最后的等式,
可以贪心一点,让S,L分别为其系数即可,,
然后用最大公因数预先处理一下。

对于最后得到的S,L贪心构造。
详情见代码。。。。

下面详解规律的由来:(不找出来都对不住我以前学的数学啊啊啊啊啊啊)
S(X1 X2 X3 X4...Xn*2)
=S(X1*2*10^(n-1)+...Xn*2*10^0)
因为对于每个xi其位上的权重已经被区分开来所以函数可拆分
=S(2*x1)+S(2*x2)+...S(2*xn)
这样就归结到对于个位数时函数的规律了。。。
那么简单的个位数的话直接打表不难找到规律,只要引入一种函数即G(n)=n>=5?1:0;
最后总函数的影响便是每个位数的G函数相加即可,,即为L。
*/
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        int tp=2*b-a;
        if(tp<0) { puts("0"); continue; }
        if(tp==0) { puts("1"); continue; }

        int S=9*b,L=2*b-a;
        if(5*L>S) { puts("0"); continue; }

        int gcd=_gcd(S,L);
        S/=gcd,L/=gcd;

        int ans[maxn],cnt=0;
        while(cnt!=L)   ans[cnt++]=5;
        S-=5*L;
        for(int i=0;i<L;i++)
        {
            if(S>0)
            {
                int sd=min(S,4);
                ans[i]+=sd;
                S-=sd;
            }
        }
        if(S>0)
        {
          int sd=S/4;
          while(sd--) ans[cnt++]=4;
          ans[cnt++]=S%4;
        }

        for(int i=cnt-1;i>=0;i--) printf("%d",ans[i]);//wrong的原因竟然是。。。顺序问题?!
        puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37451344/article/details/80785383