威尔逊定理

这个东西好像在比赛中的用处不大,而且也不像欧拉和费马一样有一些额外的拓展

威尔逊定理:

当n为质数时有:
( n − 1 ) ! ≡ − 1 ( m o d    n ) (n-1)!\equiv -1(mod\;n) (n1)!1(modn)或者是:
( n − 2 ) ! ≡ 1 ( m o d    n ) (n-2)!\equiv 1(mod \;n) (n2)!1(modn)

应用:

在网上找到了一道很有意思的数学脑洞题链接

求 ∑ k = 1 n [    ( 3 k + 6 ) ! + 1 3 k + 7 − [ ( 3 k + 6 ) ! 3 k + 7 ]    ]        ( [ x ] 表 示 向 下 取 整 ) 求\sum_{k=1}^n[\;\dfrac{(3k+6)!+1}{3k+7}-[\dfrac{(3k+6)!}{3k+7}]\;] \;\;\;([x]表示向下取整) k=1n[3k+7(3k+6)!+1[3k+7(3k+6)!]]([x])

根据威尔逊定理可知,当3k+7为素数时 , (    ( 3 k + 6 ) ! + 1    ) % ( 3 k + 7 ) = 0 (\;(3k+6)!+1\;)\%(3k+7)=0 ((3k+6)!+1)%(3k+7)=0

观察 [ ( 3 k + 6 ) ! 3 k + 7 ] , [\dfrac{(3k+6)!}{3k+7}], [3k+7(3k+6)!],分子加1后这个式子为一个整数,也就是说 [ ( 3 k + 6 ) ! 3 k + 7 ] = ( 3 k + 6 ) ! + 1 3 k + 7 − 1 [\dfrac{(3k+6)!}{3k+7}]=\dfrac{(3k+6)!+1}{3k+7}-1 [3k+7(3k+6)!]=3k+7(3k+6)!+11

所以3k+7为素数时,整个式子的答案为1


有意思的是,当3k+7不是素数时,显然3k+7可以写成a*b , 且a,b!=1,a,b!=13k+7 , 所以a和b会在(3k+6)!里面出现,即 [ ( 3 k + 6 ) ! 3 k + 7 ] = ( 3 k + 6 ) ! 3 k + 7 [\dfrac{(3k+6)!}{3k+7}]=\dfrac{(3k+6)!}{3k+7} [3k+7(3k+6)!]=3k+7(3k+6)!
所以3k+7不是素数时,整个式子的答案为0

有人问我如果a=b的时候不是在1~(3k+6)只出现一次吗?

其实,第一个出现这种情况是在k=3时,3k+7是16,也就是说我们一定可以找到其他两个数(比如2和8)

### 关于 Codeforces 平台上与威尔逊定理相关的编程问题及解决方案 #### 威尔逊定理简介 威尔逊定理是一个重要的数论结论,它表明:如果 $p$ 是一个质数,则 $(p-1)! \equiv -1 \ (\text{mod}\ p)$。换句话说,$(p-1)! + 1$ 可被 $p$ 整除[^5]。这一性质在许多涉及质数检测和大数运算的算法竞赛题目中有广泛的应用。 --- #### 经典题目解析与实现 以下是几道典型的 Codeforces 题目以及它们基于威尔逊定理的解决方法: --- ##### **题目一:Codeforces 1295D** 该题的核心在于判断给定区间内有多少个数满足某种特殊条件,而这些条件可以通过威尔逊定理简化为对阶乘取模的结果分析[^6]。 ###### 解决方案 为了高效地处理大规模数据,我们可以预先计算出所有可能需要用到的阶乘值及其对应的模意义下的结果。具体代码如下所示: ```cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MOD = 1e9 + 7; ll factorial_mod(ll n, ll p) { if (n >= p) return 0; ll result = 1; for (ll i = 1; i <= n; ++i) { result = (result * i) % p; } return result; } bool is_prime_wilson(ll p) { if (factorial_mod(p - 1, p) != p - 1) return false; return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); ll l, r; cin >> l >> r; int count = 0; for (ll i = max(l, 2LL); i <= r; ++i) { if (is_prime_wilson(i)) { count++; } } cout << count << "\n"; } ``` 这段程序首先定义了一个用于计算阶乘并对指定素数取模的功能函数 `factorial_mod`,接着借助这个工具实现了依据威尔逊定理判定某个自然数是否为素数的逻辑[^6]。 --- ##### **题目二:Prime Number Theorem Application** 虽然这不是一道具体的 Codeforces 题目名称,但它代表了一类常见的挑战场景——即如何利用包括但不限于威尔逊在内的各种经典数学理论去优化复杂度较高的枚举过程[^7]。 ###### 实现细节 当面临需要频繁验证多个候选数字是否属于素数集合的任务时,单纯依靠试除法往往难以达到理想的时间效率标准。此时引入诸如埃拉托斯特尼筛法或者更高级别的线性筛技术固然是一种不错的选择;然而,在某些特定条件下(例如仅需关心少量极大数值的情况),直接调用威尔逊定理反而能带来意想不到的优势。 示例代码片段展示如下: ```python def wilsons_theorem_test(n): from math import factorial if n < 2: return False elif pow(factorial(n - 1), 1, n) == n - 1: return True else: return False # Example Usage print(wilsons_theorem_test(11)) # Output: True ``` 在这里我们采用了 Python 内置库中的高精度整数运算能力来模拟整个流程,尽管如此仍需注意实际比赛中应尽量避免因过度依赖此类特性而导致性能瓶颈的发生[^7]。 --- #### 总结 综上所述,通过对威尔逊定理深入理解并灵活运用到不同类型的算法设计当中,不仅可以帮助参赛者更好地应对那些表面上看似棘手但实际上蕴含深刻规律可循的问题,而且还有助于培养更加严谨缜密的思维习惯! ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值