如何找到一个pascal三角形的给定行数中的数字总数,该三角形可以被一个素数整除,其中给出了行号和素数 我在python中使用以下代码
def factorial(x):
result = 1
for i in xrange(1,x+1):
result *= i
return result
def combination(n,r):
return factorial(n)/(factorial(n-r)*factorial(r))
p = input()
cnt = 0
for i in range(0,n+1):
if((combination(n,i)%p)==0):
cnt += 1
print cnt
但是给定代码需要很长时间才能获得大数字。 能否请你建议一个更好的算法。
答案 0 :(得分:6)
来自Luca's theorem的一个推论表明,素数p 不可分割的二项式系数C(n,k)的数量是
(a₁+1)⋅(a₂+1)⋅...⋅(am+1)
,其中 i 是p-ary 数字系统中n 的第i位。
示例:
p = 3, n = 7dec = 213 Result = (2+1)⋅(1+1) = 6
Pascal三角形的第7行是1 7 21 35 35 21 7 1
,它包含6个不能被3整除的系数,剩下的两个系数可以被3整除。
答案 1 :(得分:3)
您无需计算二项式系数(n,r)
。
计算p
,n!
和r!
中(n-r)!
的频率,并检查n!
是否有比{2}更多的因素p
togeter。
// sry... no python...
long count_p_in_fac(long n, long p)
{
long count = 0;
long i = 1;
long temp;
while(true)
{
temp = floor(n/pow(p,i));
count += temp;
if(temp == 0)
break;
}
return count;
}
p = input()
cnt = 0
for i in range(0,n+1):
if(count_p_in_fac(n,p) > count_p_in_fac(i,p) + count_p_in_fac(n-i,p)):
cnt += 1
print cnt
这可以避免大数字并减少操作。
这会检查(n,r) = 0 mod p
中的O(log(n))
,而不计算因子。但计算一行需要O(n log n)
。
您还可以使用(n,r)
的对称性加快速度。仅计算上半部分并将其乘以2。如果n
是偶数,则必须计算上半部分中间r = n/2
,并检查在乘以2之后添加中间数。
您可以为所有count_p_in_fac(i,p)
预先计算i
。
答案 2 :(得分:1)
您可以在不需要计算阶乘的情况下重写组合函数。 (n, r)
可以递归写为
(n, r) = (n-1, r) + (n-1, r-1)
现在我们应该找到基本情况。这些是:
(n, 1) = n
(n, 0) = 1
(n, n) = 1
在这里,我们假设n
和r
是非负整数,n >= r
成立。然后函数combination
可以重写为
def combination(n, r):
if r == 1:
return n
if r == 0 or r == n:
return 1
return combination(n-1, r) + combination(n-1, r-1)
p = input()
count = 0
for i in range(n + 1):
if combination(n, i) % p == 0:
count += 1
print count
答案 3 :(得分:1)
你不可能在不到一秒的时间内做10 ^ 12。帕斯卡尔三角区必须有一些属性才能让这更容易......如果可能的话
帕斯卡三角形的另一个有趣特性是连续p 其中p是素数,除1之外的那一行中的所有项都是 p的倍数。这很容易证明,因为如果p \ in \ mathbb {P}, 然后p除了1和它本身没有因素。每个条目 三角形是一个整数,因此根据定义(p-k)!和k!是 因素p!\,。但是,p本身无法表现出来 在分母中,因此p(或其中的一些倍数)必须是 留在分子中,使整个条目成为p的倍数。
这可能与该结果有关(来自维基页面http://en.wikipedia.org/wiki/Pascal%27s_triangle)..如果这有答案(即如果它是一些教授给你的大学作业)。
请参阅此处https://mathoverflow.net/questions/9181/pascal-triangle-and-prime-numbers
(我喜欢这个问题 - 我不确定这是一个编程问题。)
答案 4 :(得分:1)
谢谢大家回答像我这样的菜鸟问题 这是一个有效的python代码
n,p = map(int,raw_input().split(' '))
if n==p:
print n-1
elif p>n:
print 0
else:
result = 1
m = n
while n:
temp = n%p
result *= (temp+1)
n /= p
print m+1-result
答案 5 :(得分:0)
n = input("enter the row for pascal triangle:")
p = input("enter any prime number u want:")
cnt = 0
line = [1]
for k in range(0, n):
line.append(line[k] * (n-k) / (k+1))
print line
lengths = map(lambda word: line[word]%p ==0, range(len(line))).count(True)
print lengths