首页 > 其他分享 >威尔逊定理

威尔逊定理

时间:2023-07-05 21:46:31浏览次数:40  
标签:int 定理 威尔逊 long while ans ll

 威尔逊定理:若p为素数,则p可以整除(p-1)!+1

例题1:hdu5391

直接套用威尔逊定理,注意n=4的结果是2

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e9+39+7;
ll quickPow(ll a,ll b,ll m){
	ll ans=1;
	while(b){
		if(b&1)ans=(ans*a)%m;
		a=(a*a)%m;
		b>>=1;
	}
	return ans;
}
bool witness(ll a,ll n){
	ll u=n-1;int t=0;
	while(!(u&1))u>>=1,t++;
	ll x1,x2;
	x1=quickPow(a,u,n);
	for(int i=1;i<=t;i++){
		x2=quickPow(x1,2,n);
		if(x2==1&&x1!=1&&x1!=n-1)return 1;
		x1=x2;
	}
	if(x1!=1)return 1;
	return 0;
}
int Miller_Rabin(ll n,int s){
	srand(time(0));
	if(n<2)return 0;
	if(n==2)return 1;
	if(n%2==0)return 0;
	for(int i=0;i<s&&i<n;i++){
		ll a=rand()%(n-1)+1;
		if(witness(a,n))return 0;
	}
	return 1;
}
int main(){
	int T,n;cin>>T;
	while(T--){
		cin>>n;
		if(n==4)cout<<"2\n";
		else if(Miller_Rabin(n,50))cout<<n-1<<'\n';
		else cout<<0<<'\n';
	}
	return 0;
}

  

例题2:hdu2973

运用威尔逊定理,推导公式,最终直接计算1到n之间素数的个数即可

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 4e6+39+7;
bool flag[N];int prime[N],sum[N];
void Prime(int n){
	int cnt=0;
	memset(sum,0,sizeof(sum));
	memset(flag,1,sizeof(flag));
	for(int i=2;i<=n;i++){
		if(flag[i])prime[++cnt]=i;
		for(int j=1;j<=cnt;j++){
			if(i*prime[j]>n)break;
			flag[i*prime[j]]=0;
			if(i%prime[j]==0)break;
		}
	}
}
void init(){for(int i=1;i<=1000000;i++)sum[i]=sum[i-1]+flag[3*i+7];}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	Prime(4000000);
	init();	
	int T,n;cin>>T;
	while(T--){
		cin>>n;
		cout<<sum[n];
		if(T)cout<<'\n';
	}
	return 0;
}

  

例题3:hdu6608

先用米勒测试找到q,在根据威尔逊定理计算。这道题需要用到龟速乘,快速幂,Miller_Rabin测试,费马小定理,非常经典的一道题

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N = 1e7+39+7;
ll p,q;
ll quickMul(ll a,ll b,ll m){
	ll ans=0;
	while(b){
		if(b&1)ans=((ans%m)+(a%m))%m;
		a=((a%m)+(a%m))%m;
		b>>=1;
	}
	return ans;
}
ll quickPow(ll a,ll b,ll m){
	ll ans=1;
	while(b){
		if(b&1)ans=quickMul(ans,a,m);
		a=quickMul(a,a,m);
		b>>=1;
	}
	return ans;
}
bool witness(ll a,ll n,ll u,ll t){
	ll x1,x2;
	x1=quickPow(a,u,n);
	for(ll i=1;i<=t;i++){
		x2=quickPow(x1,2,n);
		if(x2==1&&x1!=1&&x1!=n-1)return 1;
		x1=x2;
	}
	if(x1!=1)return 1;
	return 0;
}
bool Miller_Rabin(ll n){
	ll u=n-1,t=0;
	while(!(u&1))u>>=1,t++;
	if(n<2)return 0;
	if(n==2)return 1;
	if(n%2==0)return 0;
	for(ll i=1;i<=50;i++){
		ll a=rand()%(n-1)+1;
		if(witness(a,n,u,t))return 0;
	}
	return 1;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin>>T;
	while(T--){
		ll ans=1;
		cin>>p;ans=p-1;
		q=p-1;
		while(!Miller_Rabin(q))q--;
		for(ll i=q+1;i<=p-1;i++)ans=quickMul(ans,quickPow(i,p-2,p),p);
		cout<<ans<<'\n';
	}	
	return 0;
}

  

标签:int,定理,威尔逊,long,while,ans,ll
From: https://www.cnblogs.com/zhanghx-blogs/p/17529868.html

相关文章

  • Arrangement排列•Combination组合•Counting计数•Binomial Theorem二项式定理
    符号C-Combination组合数[1]A-Arrangement(旧教材为P-Permutation)N-Number元素的总个数(自然数集合).M-参与选择的元素个数(M不大于N,两者都是自然数集合).!-Factorial阶乘.Arrangement排列与Combination组合:注意:n,m都是自然数,且m<=n,下同.排列的定义:从n......
  • 一个简单棋盘覆盖定理的证明
    能够用\(1\timesl\)的矩形覆盖\(n\timesm\)棋盘的充要条件是\(l\midn\lorl\midm\)。充分性显然,考虑证明必要性。为了方便,我们将行和列记为\(0\simn-1\)和\(0\simm-1\)。考虑设\((i,j)\)的权值为\(\omega_{l}^{i+j}\),一个\(1\timesl\)的矩形覆盖的区域显然......
  • 欧拉定理
    欧拉定理定理内容对于两个互质的整数a,n有\(a^{\varphi(n)}\equiv1(mod\enspacen)\)这里的\(\varphi(n)\)指的是欧拉函数。-数学证明由\(\varphi(n)\)可知从1到n与n互质的有\(m_1,m_2,m_3\dotsm_{\varphi(n)}\)。全部乘以a得\(am_1,am_2,am_3\dotsam_{\varphi(n)}\),由起......
  • Luogu P4720 【模板】扩展卢卡斯定理/exLucas
    【模板】扩展卢卡斯定理/exLucas题目背景这是一道模板题。题目描述求\[{\mathrm{C}}_n^m\bmod{p}\]其中\(\mathrm{C}\)为组合数。输入格式一行三个整数\(n,m,p\),含义由题所述。输出格式一行一个整数,表示答案。样例#1样例输入#1533样例输出#11样例#2......
  • 关于实数列上下极限一个定理的注解分析
    Ayumu的数学分析第18课讲到如下一个定理:这个定理没有什么问题.但是随后的注解部分是有问题的,摘录如下:在注解的扩展定义中,E可以涵盖上极限是-∞的情形,但不能涵盖上极限是+∞的情形;同样,F可以涵盖下极限是+∞的情形,但不能涵盖下极限是-∞的情形.具体看几个例子.......
  • 欧拉函数,欧拉定理,费马定理
    欧拉函数:指从1-n中与n互质的数的个数首先要知道,一个数$n$分解质因数之后会变成这样一个形式:$n$= $p1k1$ +$p2k2$+...+$pnkn$而欧拉函数:$φ$=$n$*(1-1/p1)*(1-1/p2)*...*(1-1/pn).证明: 1.由于n可以被分解为p1,p2..的倍数,那么首先要用n-n/p1-n/p2......
  • 一种证明勾股定理的方法
    我最近想到了一种新的证明勾股定理的方法考虑直角三角形\(ABC\),假设\(B\)是直角,\(AB=x,BC=y\),过\(B\)作\(AC\)的垂线交\(AC\)于\(H\),显然三角形\(ABH\),\(BHC\),\(ABC\)两两相似。所以\(\frac{AH}{BH}=\frac{AB}{BC}=\frac{a}{b}\)令\(AH=kx\),则\(BH=ky\),由射影定理可得\(BH^2=AH......
  • [数论]中国剩余定理CRT
    ChineseRemainderTheorem\(x≡ai(modmi)\)中国剩余定理CRT1.定义Th.给出一元线性同余线性方程组\(x≡a1\bmodm1\)\(x≡a2\bmodm2\)...\(x≡an\bmodmn\)定理指出假设素数\(m1,m2...mn\)两两互素,对任意的整数\(a1,a2...an\)上述方程有解,并且可以通过如下......
  • 【笔记】韦达定理的定义与证明
    前言已知,一元二次方程\(ax^2+bx+c=0\)\((a,b,c\in\mathbb{R},a\not=0)\)有如下求根公式:\[\Delta=b^2-4ac\]\[x_{1,2}=\frac{-b\pm\sqrt{\Delta}}{2a}\]当\(\Delta<0\)时,方程无实数根;当\(\Delta=0\)时,方程有两个相等的实数根(\(x_{1}=x_{2}\));当\(\D......
  • 算法学习笔记(25): 矩阵树定理
    矩阵树定理本文不作为教学向文章。比较好的文章参考:矩阵树-定理以及凯莱公式【学习笔记】矩阵树定理(Matrix-Tree)_繁凡さん的博客-CSDN博客矩阵树定理入土-ixRic的博客-洛谷博客对于无向图无向图中应该是矩阵树定理的常用场景。无向图的矩阵树定理讲的是:......