关闭

HDU 5710 Digit-Sum

767人阅读 评论(0) 收藏 举报
分类:
【题意】我们要找出最小的正整数n满足——
a*S(n)==b*S(2n)

a,b的范围都在[1,100]

【分析&推导】

首先可以有这样的基础性结论:
设gcd(a,b)=g, 我们可以先使得b=b/g, a=a/g
S(n):S(2n)==b:a,那么我们有S(n):S(2n)=b:a。

然后,一个好的做法是,我们研究本质问题。
我们发现,如果一个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'之后,还有剩余,那么在前面贪心填充。

【AC代码】

#include <stdio.h>
#include <iostream>
using namespace std;
int ans[10005];
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    int t,a,b,m,n,k;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&a,&b);
        n=9*b,m=2*b-a;
        if(m<0||5*m>n){
            puts("0");
        }
        else if(m==0){
            puts("1");
        }
        else{
            k=gcd(n,m);
            n/=k;
            m/=k;
            n-=5*m;
            for(int i=0; i<m; i++,n-=k){
                k=min(4,n);
                ans[i] = k+5;
            }
            while(n>4){
                ans[m++]=4;
                n-=4;
            }
            if(n)
                ans[m++]=n;
//            for(int i=0; i<m-1; i++){
//                printf("%d",ans[i]);
//            }
//            printf("%d\n",ans[m-1]);
            for(int i=m-1; i>=0; i--) printf("%d",ans[i]);
            puts("");
        }
    }
    return 0;
}


1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

hdu 1024 Max Sum Plus Plus(动态规划+m子段和的最大值)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Limit: 2000/1000 MS (J...
  • qiqi_skystar
  • qiqi_skystar
  • 2016-01-28 12:40
  • 2466

HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】

就拿杭电OJ上的第1003题开始吧,这题比原书要复杂一些。 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your ...
  • u012846486
  • u012846486
  • 2014-05-18 21:08
  • 1440

HDU 4407 Sum (容斥原理)

这题难点就是看出来用容斥原理做,可以先分析时间复杂度大致确定用我已知的数据结构做不了。。。我们会发现刚开始数据是1-n,如果不做任何修改的话,只查询的话的确可以用容斥原理做,就是把p质分解,然后没有p...
  • u010697167
  • u010697167
  • 2013-09-05 17:52
  • 1019

HDU 5710 Digit-Sum 数学杂题

原题见HDU 5710题意:定义S(N)S(N)是NN的数位之和,给出一对a,b(0<a,b<101)a,b(0<a,b<101),求是否存在nn满足a×S(n)=b×S(2n)a\times S(n...
  • Danliwoo
  • Danliwoo
  • 2016-07-05 17:12
  • 1110

HDU 5710 Digit-Sum (构造)

Problem DescriptionLet S(N) be digit-sum of N, i.e S(109)=10,S(6)=6. If two positive integers a,b a...
  • DorMOUSENone
  • DorMOUSENone
  • 2017-05-05 18:34
  • 172

Hdu 5710 Digit-Sum【思维】

Digit-Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota...
  • mengxiang000000
  • mengxiang000000
  • 2017-07-24 18:11
  • 200

sum of Digit

  • 2013-05-02 14:14
  • 659B
  • 下载

Sicily 7969. Digit Sum

7969. Digit Sum Constraints Time Limit: 1 secs, Memory Limit: 256 MB Description F...
  • u012925008
  • u012925008
  • 2015-03-12 14:50
  • 524

Project Euler 题解 #16 Power digit sum

题目:Power digit sum 215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. What is the sum...
  • tianxia_taiping
  • tianxia_taiping
  • 2013-09-26 12:45
  • 831

Problem 16:Power digit sum

原题链接:http://projecteuler.net/problem=16 215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 ...
  • cfeibiao
  • cfeibiao
  • 2013-09-08 22:15
  • 611
    个人资料
    • 访问:378396次
    • 积分:15887
    • 等级:
    • 排名:第784名
    • 原创:1254篇
    • 转载:13篇
    • 译文:0篇
    • 评论:61条
    文章分类