O(logn)O(logn)O(logn)时间复杂度的情况下计算 t!t !t! 和 ata ^ tat。
快速幂计算在笔试中写过好多次了,万万没想到阶乘也可以。
import sys
def power(n, m):
global number, cn, p_size, mask
if (m == 1):
cur = n
elif(m & 1 != 0):
cur = n * power(n, m - 1)
else:
cur = power(n, m >> 1)
cur *= cur
cn[number] = (cur >> ((m >> 1) * p_size)) & mask
number += 1
return cur
def factor(n):
global number, cn, p_size, mask
if (n == 1):
return 1
elif(n & 1 == 1):
return n * factor(n - 1)
else:
cur = factor(n >> 1)
pos = number
number += 1
return cn[pos] * cur * cur
def factorial(n):
global number, cn, p_size, mask
x = (1 << n) + 1
number = 0
mask = (1 << n) - 1
p_size = n
power(x, n)
number = 0
return factor(n)
p_size = 0
mask = 0
cn = []
number = 0
N = int(sys.stdin.readline().strip())
for ppp in range(N):
line = sys.stdin.readline().strip()
a,t = list(map(int, line.split()))
cn = [0 for i in range(t+1)]
p = power(a, t)
number = 0
q = factorial(t)
print(max(p, q))
226

被折叠的 条评论
为什么被折叠?



