
解题思路:结合图式求min(C(n, m), 1e18)
如果m > n / 2 则有 m = n - m
计算可得当m大于40的时候C必然大于1e18
所有只用大数暴力求解m较小部分的情况,或者用C++int128边算边约分
ps: py的整数除运算要用// 不然会变为浮点数
mx = 1000000000000000000
def gcd(a,b):
if a%b == 0:
return b
else :
return gcd(b,a%b)
while True:
try:
n, m = map(int, input().split())
if (n - m < m):
m = n - m
if(m > 100):
print(mx)
continue
ra = 1
rb = 1
for i in range(n - m + 1, n + 1):
ra = ra * i
for i in range(1, m + 1):
rb = rb * i
ans = ra // rb
ans = min(ans, mx)
print(ans)
except:
break;
组合数学快速求解
本文介绍了一种利用组合数学原理快速求解特定问题的方法。通过分析当参数m超过n的一半时,可以转换为求解n-m的问题,进一步发现当m大于40时,组合数必然超过1e18。文章提供了使用大数暴力求解和C++ int128类型的计算策略,以及Python中避免浮点数运算的方法。
5091

被折叠的 条评论
为什么被折叠?



