备战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)