这涉及数学的排列组合,首先,我们知道,两数只要有一个数是三的倍数,那么他们的积也是3的倍数
分为两种情况,当n = 2时是绝对不能满足条件的
当n是大于2的偶数,是3的倍数数字的个数和是3倍数位置的个数错开是完全可以大于总数的一半的
对于第二种情况,我们使用排列组合,先考虑3倍数重叠部分,再考虑不能重叠的部分,然后考虑剩下的部分
最终,把3个部分相乘即可得到答案
因为结果要取模,要懂得运用费马小定理和模拟元的知识,自定义排列,组合,阶乘的函数
mod = 1000000007
# 阶乘
def my_fac(n):
ans = 1
for i in range(1, n + 1):
ans = (ans * i) % mod
return ans
# 组合运算
def my_comb(n, k):
nr = my_fac(n)
dr = (my_fac(k) * my_fac(n - k)) % mod
inv_dr = pow(dr, mod - 2, mod)
return (nr * inv_dr) % mod
# 排列运算
def my_perm(n, k):
nr = my_fac(n)
dr = my_fac(n - k)
inv_dr = pow(dr, mod - 2, mod)
return (nr * inv_dr) % mod
n = int(input())
# 统计3的倍数数量
b = n // 3
# 统计一半数量
c = n // 2
if n == 2:
print(0)
else:
# 3倍相交部分
res = my_comb(b, 2 * b - c) % mod; res = (res * my_perm(b, 2 * b - c)) % mod
# 3倍不相交部分
res = (res * my_perm(n - b, c - b)) % mod
# 剩余部分
res = (res * my_perm(n - b, n - b)) % mod
print(res)

京公网安备 11010502036488号