zoukankan      html  css  js  c++  java
  • 联通数

    联通数

    问题描述

    数学高手小G最近发现了一种新型的数!
    他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk...(1≤k≤9)并在其中间添加加号,且相邻两个加号之间至少含有两个数字k (默认数字串第一个数字前与最后一个数字后也有两个加号),然后对其进行求和得出一个新的数。像这样得出的数他将其定义为 “k联通数 ”。
    小G对于他的发现感到非常的自豪,像数字854就能表示为77+777,因此854是7联通数。
    小G现在非常好奇,究竟有哪些数可以是k联通数呢?他想考验一下你。
    询问T次,每次给定两个数n,k,判断n是否为k联通数,如果是,输出YES,否则出NO。

    输入格式

    第一行一个整数T,表示询问个数。
    接下来T行,每行两个整数n,k,意义如上所示

    输出格式

    T行,每行输出 YES 或 NO。

    样例输入

    3

    854 7

    111 2

    554 2

    样例输出

    YES

    NO

    YES

    数据范围

    题解

    观察题目给的例子 854=77+777=7*(11+111)

    事实上对于任意一个k联通数,可以写成如下形式:

    n=k×(num1*11+num2*111+num3*1111+……) ,其中numi为非负整数

    显然若n不是k的倍数,则n一定不是k联通数

    若n为k的倍数,则问题转化为判断n/k是否由num1*11+num2*111+num3*1111+……组成

    探究11,111,1111,……这些数的关系

    11=11

    111=111

    1111=11*100+11

    11111=111*100+11

    111111=111*1000+111

    1111111=111*10000+11*100+11

    ……

    我们发现,所有11,111,1111,……这些数都可以拆成111*x+11*y的形式(x,y为非负整数)

    对于n/k,我们枚举x,再判断是否存在y,使得111*x+11*y==n/k即可

    即判断n/k-111*x是否为11的倍数

     1 #include <cstdio>
     2 #define ll long long
     3 int T,k;
     4 ll n,x;
     5 int main()
     6 {
     7     int i;
     8     bool flg;
     9     scanf("%d",&T);
    10     while (T--)
    11     {
    12         scanf("%lld%d",&n,&k);
    13         if (!n || n%k)
    14         {
    15             printf("NO
    ");
    16             continue;
    17         }
    18         x=n/k;
    19         for (i=flg=0;i*111ll<=x;i++)
    20           if (!((x-i*111ll)%11))
    21           {
    22               flg=1;
    23               break;
    24           }
    25         if (flg) printf("YES
    ");
    26         else printf("NO
    ");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    20140327工作室日志
    20140326学习工作室日志
    标准连接池实现
    JDBC
    监听器
    数据表多对多
    MATLAB 中几个颜色空间的坐标范围
    RabbitMQ(一)
    Web Service之Axis(二)
    Web Service之CXF(四)
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/15046850.html
Copyright © 2011-2022 走看看