我已经做了很多工作,但无法找到更大的测试用例的答案
在数学中,二项式系数是一族正整数,在二项式定理中作为系数出现。 C(n,k)表示从n个不同对象中选择k个对象的方式的数量。
然而,当n和k太大时,我们经常在模数运算后用素数P保存它们。请用P求模后计算n的二项式系数变为0。
输入的第一个是整数T,即测试用例的数量。
以下T行中的每一行包含2个整数,n和素数P.
对于每个测试用例,输出一行包含\ tbinom nks(0< = k< = n)的数量,其中每个模数运算后的P为0。
3
2 2
3 2
4 3
1
0
1
我已经通过在二项式系数中使用余数定理来完成这个
#C(n,m) mod p
#n=l*p+t
#m=m*p+s
#then C(n,r) mod p=0 when (t<s or t=0)
inp1 = raw_input()
N=int(inp1)
result=[]
for i in range(N):
inp = raw_input()
a, b = [long(x) for x in inp.split(' ')]
j=0
#n=lp+t
t=a%b
t=t+1
l=a/b
j=l*(b-t)
result.append(j)
for i in range(N):
print result[i]
以上条件满足小数
示例测试用例
N = 18794630773460178101742670493883191390743597826923079533199667903991430393463990462500322752062869664969026409174076912867222446746310051635510258172105034070506806228555577773599018819952185016092141574603857551738968553782672643049704163674318579695215402562964641111900657274032612661770435202254364177910753450214277150377049334509093906874400306682949871260040370515062243982543271073443613028133844603853807066311479739789908983610180228625059956919930500586048799830730348503994503184106117058
p = 177080341
我的输出是
2296508200406431043037217853758906667313789305876262916681342008001095232916608835588093082038358975456171743147798282523487485386336553910277635713985851142371010771392102277877640275384064735398164190968282400640398659343189330639672472613876688344609533340662724884373078840434716174167873375700938597411315754265893890741730938202927739246687866166994143001482839656000969674716959277820008958538229366474207686428750934149471409162993083541475267772950721250234982686128039722553219836725588488
预期产出
18794630773460178101742635959946548665553041135822283621364103266511586625905046107130878283695016799933475657268010472422112556606280021574002866456544310584537519228161286450725015989697306855581489155139723025246780552510467580791551824827637581156204185887378181074365453150481221030356075255000460025095384537510111086396988416046942446776262625161326885418101128327416784858513888616089287333560469336094431461981368825028447505354473183546488856594449627370807707483671453574074503184106117059
答案 0 :(得分:14)
您可以从另一端查看:nCr
可以将 整除多少p
?有一个相当简单的公式。
二项式系数nCr
由
nCr = n! / (r! * (n-r)!)
因此v_p(nCr)
中p
的多样性nCr
- p
的素数因子化中nCr
的指数 - 是
v_p(nCr) = v_p(n!) - v_p(r!) - v_p((n-r)!)
p
中n!
的多重性很容易确定,众所周知的计算方法是
v_p(n!) = ∑ floor(n/p^k)
k > 0
如果你看一下这个公式,考虑p
的基础 - n
扩展,你可以看到
v_p(n!) = (n - σ_p(n)) / (p - 1)
其中σ_p(k)
是p
的基数 - k
表示的数字之和。因此
v_p(nCr) = (n - σ_p(n) - r + σ_p(r) - (n-r) + σ_p(n-r)) / (p - 1)
= (σ_p(r) + σ_p(n-r) - σ_p(n)) / (p - 1)
nCr
和p
的添加没有基数{{}}时, r
不可被n-r
整除{1}}。
因为那恰好是p
。如果σ_p(a + b) = σ_p(a) + σ_p(b)
和a
的相应数字之和(加上可能的进位,如果已经为较低有效数字产生了进位)为b
,则会发生加法中的进位,然后总和中的相应数字减少>= p
,下一个更高有效数字增加1,数字和减少p
。
如果对p - 1
的基础 - n = r + (n-r)
扩展中的每个数字p
,我们在基数d_k
中有一个免提n
,相应的p
的数字小于或等于r
。 d_k
数字的可接受选择是独立的,因此总数是各个数字的选择计数的乘积。
不能被素数r
整除的nCr
的数量是
p
其中ND(n,p) = ∏(d_k + 1)
是d_k
基础n
扩展中的数字,
p
由于给定 m
n = ∑ d_k * p^k
k=0
有n+1
(非零)二项式系数nCr
,因此n
可以整除的(非零)二项式系数nCr
的数量是
p
以 m
n + 1 - ∏ (d_k + 1)
k=0
扩展p
为基础。
使用Michael's example n
,n = 10
,
p = 3
因此有10 = 1*3^0 + 0*3^1 + 1*3^2
个系数(1+1)*(0+1)*(1+1) = 4
不能被3整除,10Cr
可被3整除。
10 + 1 - 4 = 7
答案 1 :(得分:0)
你的公式已关闭。
你正在计算l *(p - t - 1)。
如果存在p ^ 2,p ^ 3等因子,则该公式不起作用。当l> 1时,这将发生。 p(也可能是m> p)。
对于小数字,请尝试n = 10,p = 3以查看我在说什么。你的计算将返回r的3个值,其中10 C r mod 3 = 0,但事实上,有7个。