知识点 - python
解决问题类型:
自带高精度、快速幂、gcd、Karatsuba快速乘
注意python的除法,\ 是浮点数的除,会自动将int转化为float然后丢失精度。
复杂度:
Karatsuba快速乘: O ( 3 n 1.585 ) O(3n^{1.585}) O(3n1.585)
例题
E. Resistors in Parallel,2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest
n个电阻,编号为i的电阻阻值为 i ,但如果i可以被大于4的平方数整除,这个电阻的阻值就是 ∞ \infty ∞。
你现在可以选择一个 x < = n x<=n x<=n ,将所有编号为 x x x 的因数的电阻并联起来。问能得到的等价电阻最小为多少?输出它的分数形式。
解:
根据样例手模出来选的 x x x 就是前几个质数的乘积。
比如
n
=
1000
n=1000
n=1000时:选
x
=
2
∗
3
∗
5
∗
7
x=2*3*5*7
x=2∗3∗5∗7 电阻为:
2
∗
3
∗
5
∗
7
1
+
2
+
3
+
5
+
7
+
2
∗
3
+
2
∗
5
+
2
∗
7
+
3
∗
5
+
3
∗
7
+
5
∗
7
+
2
∗
3
∗
5
+
3
∗
5
∗
7
+
2
∗
5
∗
7
+
2
∗
3
∗
7
+
2
∗
3
∗
5
∗
7
\frac{2\ *\ 3\ *\ 5\ *\ 7}{1\ +\ 2\ +\ 3\ +\ 5\ +7+\ 2\ *\ 3\ \ +\ 2\ *\ 5+\ 2\ *\ 7\ +\ 3\ *\ 5\ +3\ *\ 7\ +\ 5\ *\ 7+2\ *\ 3\ *\ 5\ +\ 3\ *\ 5\ *\ 7\ +\ 2\ *\ 5\ *\ 7\ +\ 2\ *\ 3\ *\ 7\ \ +\ 2\ *\ 3\ *\ 5\ *\ 7}
1 + 2 + 3 + 5 +7+ 2 ∗ 3 + 2 ∗ 5+ 2 ∗ 7 + 3 ∗ 5 +3 ∗ 7 + 5 ∗ 7+2 ∗ 3 ∗ 5 + 3 ∗ 5 ∗ 7 + 2 ∗ 5 ∗ 7 + 2 ∗ 3 ∗ 7 + 2 ∗ 3 ∗ 5 ∗ 72 ∗ 3 ∗ 5 ∗ 7
于是我们计算
x
x
x的 等价电阻,为
∏
p
∣
n
p
∏
p
∣
n
(
p
+
1
)
\frac{\prod_{p|n}p}{\prod_{p|n}(p+1)}
∏p∣n(p+1)∏p∣np
代码
import math
#10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
A=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257]
s=1
cnt2=0
B=[]
B.append(0)
for x in A:
s *= x
cnt2 = cnt2 + 1
B.append(int(s))
T = int(input())
for kase in range(T):
now = int(0)
n=int(input())
for i in range(55):
if(int(B[i+1])>n):
now=i
break
up=int(1)
down=int(1)
for i in range(now):
up*=int(A[i]+1)
down*=int (A[i])
d=math.gcd(up,down)
up=int(up // d)
down=int(down // d)
txt=str(down)+'/'+str(up)
print(txt)
#一行读入
A=list(map(int,input().split()))
#sort
A=sorted(A)
#
#多维数组
a=[]
for i in range(100):
a.append([])
for j in range(100):
a[i].append(0)