找到二项式系数模数素数,采访街道挑战

时间:2012-08-08 14:49:15

标签: python algorithm primes largenumber binomial-coefficients

我已经做了很多工作,但无法找到更大的测试用例的答案

问题陈述

在数学中,二项式系数是一族正整数,在二项式定理中作为系数出现。 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

约束:

  • T小于100
  • n小于10 ^ 500。
  • P小于10 ^ 9。

Attemted solution

我已经通过在二项式系数中使用余数定理来完成这个

         #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

2 个答案:

答案 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)!)

pn!的多重性很容易确定,众所周知的计算方法是

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)

结论:

当且仅当nCrp的添加没有基数{{}}时,

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的数字小于或等于rd_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 nn = 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个。