当前位置: 首页 > 后端技术 > Python

AtCoderContextABC156D-Bouquet(鲜花花束)

时间:2023-03-26 13:23:35 Python

运行要求运行时间限制:2sec内存限制:1024MB未经许可,原标题不得转载。从这些品种中选择不止一束作为您的花束。但是,小明讨厌a和b这两个数字。无法制作与a或b相同编号的花束。问小明他能做多少束花。结果除以10^9+7mod的结果在这里,如果有两束花的话。花束A,花束B。如果花束A中使用的鲜花不在花束B中,则花束A和花束B算作不同的花束。输入前提所有输入都是整数2<=n<=10^91<=a<=b<=min(n,2*10^5)输入和输入遵循以下形式标准输入nab输出输出小明可以做出的类型花束。结果是(10^9+7)的模。例1输入413输出7小明讨厌数字1和3。在这种情况下,小明可以做一束2朵花,或者4朵花。有6种方法可以从4朵花中选择2朵。有1种方法可以从4朵花中选择4朵。一共有6+1=7种。例2输入1000000000141421173205输出34076506阅读题中有n多朵花,每朵花只有一种。这道题可以抽象成n个球的排列组合问题,每个球不一样,从n个球中取出m个球,一共有C(n,m)种解法。不可能从n个球中取出一个球。从n个球中取出b个球有(n,a)种方法。从n个球中取出b个球有c(n,b)种方法。然后从n个球中取出1、2,3、4、5……n有多少种方法?每个球都有拿和被拿两种状态,所以一共有2^n种拿法。在2^n种方式中,n个球没有被拿走。情况,所以满足要求的方法数是2^n-1,那么答案就是2^n-1-c(n,a)-c(n,b)以下是n比较难的地方可以高达10^9所以我们需要计算2^n和c(n,a)。普通的计算根本不可能。题目要求我们取10^9+7的模。我们先计算2^n。官方的方法是“fastpower”算法。下面贴出“速成”算法的python实现,不过python自带的pow方法可以传第三个参数mod。当指定第三个参数时,表示每进行一次阶乘运算,就用mod取mod。我看了一下pow方法的注释defpow(*args,**kwargs):#realsignatureunknown"""Equivalenttox**y(with2arguments)orx**y%z(with3arguments)某些类型,例如int,在使用三参数形式调用时能够使用更高效的算法。"""pass当传递第三个参数时,将使用一些非常高效的算法。在实际使用中,也是很快的。我们还认为,python自带的pow传递给第三个参数mod时,使用的是fastpower方式。下一个难度c(n,a)=n(n-1)(n-2)...+(n-a+1)/a!假设X=n(n-1)(n-2)...+(n-a+1)Y=a!我们需要找到X%(10^9+7)并对每个乘法进行模运算。我们要求1/Y%((10^9+7))这样怎么好呢,模运算中的除法不像模运算中的乘法,简单的除一次,按照费马的一点点去模像mod=10^9+7这样的数字的定理所以我们需要找到(1/Y)%mod只需要得到Y^(mod-2)%mod对于Y^(mod-2)我们使用快速取幂。python自带的pow函数可以帮我们做到这一点。代码快幂https://blog.csdn.net/ggdhs/a...AC结果n,a,b=10,2,3n,a,b=map(int,input().split())defjiecheng(开始,结束):res=1foriinrange(start,end+1):res=(res*i)%(10**9+7)returnresdefcomb(n,a):X=jiecheng(n-a+1,n)%(10**9+7)Y=jiecheng(1,a)S=X*pow(Y,10**9+5,10**9+7)returnSdef计算(n,a,b):s=pow(2,n,10**9+7)-1s1=comb(n,a)s2=comb(n,b)res=s-s1-s2res=res%(10**9+7)returnresresult=calculate(n,a,b)print(result)总结本题考查排列组合的使用,快幂的使用,费马小定理的应用.※ 另外,我会在我的微信个人订阅号推出一些文章,欢迎关注