2024蓝桥杯每日一题(组合计数)

发布于:2024-04-23 ⋅ 阅读:(25) ⋅ 点赞:(0)

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:计算系数
        试题二:求组合数1
        试题三:求组合数2
        试题四:杨辉三角形


试题一:计算系数

【题目描述】

        给定一个多项式 (ax+by)k,请求出多项式展开后 xnym项的系数。

【输入格式】

        共一行,包含 55 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。

【输出格式】

        输出共 1行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007取模后的结果。

【数据范围】

        0≤n,m≤k≤1000
        n+m=k
        0≤a,b≤106

【输入样例】

1 1 3 1 2 

【输出样例】

3

【解题思路】

【Python程序代码】

a,b,k,n,m = map(int,input().split())
p = 10007
res = pow(a,n,p)*pow(b,m,p)%p
for i in range(1,n+1):
    res=res*(k-i+1)%p
    res = res*pow(i,p-2,p)%p
print(res)

试题二:求组合数1

【题目描述】

        给定 n 组询问,每组询问给定两个整数 a,b,请你出 Cbamod(109+7)的值。

【输入格式】

        第一行包含整数 n。        

        接下来 n 行,每行包含一组 a 和 b。

【输出格式】

        共 n 行,每行输出一个询问的解。

【数据范围】

        1≤n≤10000
        1≤b≤a≤2000

【输入样例】

3
3 1
5 3
2 2

【输出样例】

3
10
1

【解题思路】

        模板题:f[i][j] = (f[i-1][j] + f[i-1][j-1])%p

【Python程序代码】

n = int(input())
f = [[0]*2010 for _ in range(2010)]
f[1][0]=f[1][1]=1
p=10**9+7
for i in range(2,2001):
    for j in range(i+1):
        f[i][j] = (f[i-1][j] + f[i-1][j-1])%p
for i in range(n):
    a,b = map(int,input().split())
    print(f[a][b])

试题三:求组合数2

【题目描述】

        给定 n 组询问,每组询问给定两个整数 a,b,请你出 Cbamod(109+7) 的值。

【输入格式】

        第一行包含整数 n。

        接下来 n 行,每行包含一组 a 和 b。

【输出格式】

        共 n 行,每行输出一个询问的解。

【数据范围】

        1≤n≤10000
        1≤b≤a≤105

【输入样例】

3
3 1
5 3
2 2

【输出样例】

3
10
1

【解题思路】

        用逆元:res = fac[a]*infac[a-b]%p*infac[b]%p

【Python程序代码】

N = 10**5+10
fac,infac = [1]*N,[1]*N
p = 10**9+7
for i in range(1,N-9):
    fac[i] = (fac[i-1]*i)%p
for i in range(1,N-9):
    infac[i] = pow(fac[i],p-2,p)
n = int(input())
for i in range(n):
    a,b = map(int,input().split())
    res = fac[a]*infac[a-b]%p*infac[b]%p
    print(res)

试题四:杨辉三角形

【题目描述】

        下面的图形是著名的杨辉三角形:

         如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ...给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?

【输入格式】

        输入一个整数 N。

【输出格式】

        输出一个整数代表答案。

【数据范围】

        对于 20%20% 的评测用例,1≤N≤10
        对于所有评测用例,1≤N≤109

【输入样例】

6

【输出样例】

13

【解题思路】

        首先往右找到发现C(34,17)>1e9,所有b从17~1开始枚举,每次二分a判断C(a,b)是否等于x,如果等于计算一下是第几个数。

【Python程序代码】

n = int(input())
ans = 10**18
def cal(a,b):
    return (1+a)*a//2+b+1
def work(a,b):
    res = 1
    for i in range(1,b+1):
        res*=(a-i+1)
    for i in range(1,b+1):
        res//=i
    return res
def ck(a,b):
    res = work(a,b)
    if res>=n:return True
    return False
if n==1:
    print(1)
else:
    for b in range(17,0,-1):
        l,r = b,10**9
        while l<r:
            mid = (l+r)>>1
            if ck(mid,b):r=mid
            else:l=mid+1
        a = r
        if work(a,b)==n:
            ans = min(ans,cal(a,b))
    print(ans)