编程笔试-美丽的数字

2018-10-10  本文已影响0人  飞机大河马

题目

小A有两个幸运数字字符a和b。他认为一个数很美当且仅当这个数字只包含字符a和b,且这个数字没位数字之和也只包含数字字符a和b。例如:幸运数字字符为1和2,那么11就很美,其每位数字之和为2,11和2都只含有数字字符1和2,。但是12、21、111都不美,虽然它们本身都只含有数字字符1和2,但它们的每位数字之和都为3,而3不是幸运数字字符。
现在小A想知道对于所有的k位数字,有多少个美丽的数字?

输入描述

一行包含3个数字,a、b和k,其中1\leq a,b\leq 9
对于10%的数据:1\leq k\leq 10
对于20%的数据:1\leq k\leq 10^3
对于100%的数据:1\leq k\leq 10^6

输出描述

一行包含一个数字,即美丽的数字个数。由于答案可能很大,请对1000000007(10^9+7)取模。

解题思路

思路一:暴力法

枚举所有的k位数字,判断是否为美丽的数字,得到所有符合条件的解的个数.

思路二:组合法

已知k位数字只包含数字字符a和b,根据题意可知,一个数字是否美丽只和其包含a和b的个数有关,因此可以先判断出包含m个a字符的数字是否为美丽的数字,其中m=0,...,k。得到相应的m_1,m_2,...,m_L。最终美丽的数字个数为C=C_{n}^{m_1}+...+C_{n}^{m_L}

示例代码

import math

k = 2
digit_a = 1
digit_b = 2
result = 0


def c(n, r):
    f = math.factorial
    return f(n) // f(r) // f(n - r)


def is_beautiful(number, a, b):
    if number == 0:
        return False
    while number != 0:
        digit = number % 10
        if digit != a and digit != b:
            return False
        number //= 10
    return True


for i in range(k + 1):
    temp = i * digit_a + (k - i) * digit_b
    if is_beautiful(temp, digit_a, digit_b):
        result += c(k, i)
result = result % 1000000007
print(result)

上一篇 下一篇

猜你喜欢

热点阅读