[hdu-6608] Fansblog 威尔逊定理 质数的密度分布 2019 多校 3

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6608

题目大意:给一个质数P (1e9≤p≤1e14),找比它小的最大质数Q,求Q! Module P

1.质数密度分布:质数分布的比较密,在p周围100内应该能遇到质数,所以q可以从大到小枚举

2.判断10^14 内数x是否为质数,只用提前筛出1^7 内质数看是否有x因子

3.威尔逊定理 (p−1)!≡−1(mod p) 当p是质数时 ,实际上就是 (p-1)! mod p =p-1 求Q! MOD P = (P-1)!/(P-1)/(P-2).../(Q+1) MOD P  =(P-1)*INF(P-1)*INF(P-2)*...*(Q+1)MOD P

INF(x)为 x逆元

4.求逆元方法:①费马小定理 a*ap-2 ≡ 1 (mod p)  用快速幂求出ap-2即求出aa的逆元.

②扩展欧几里得 xa≡1 mod p  解 xa+yp=1

因为p太大,用费马小定理会超时,用扩展欧几里得求

ps:p太大,直接(p-1)*(p-2)时会超long long,用快速乘(把乘法分解为多次加法,一边加一边取模)

#include<bits/stdc++.h>
using namespace std;
//( p -1 )! ≡ -1 =p-1( mod p )  当p为素数时
long long  const n=1e7+100;
typedef long long ll;
ll prime[n];
ll p,q,cntprime,ans;

bool flag[n];
void exgcd(ll a,ll b,ll &x,ll &y){//扩展欧几里得求逆元快一点,用费马小定理 a^(p-2)  由于p太大,容易超时
	if(!b){x=1;y=0;}
	else {exgcd(b,a%b,y,x);y-=x*(a/b);}
}
ll getinv(ll a){//求q!%p  相当于= (p-1)!/(p-1)/(p-2)...(q+1)%p  用逆元
	ll x,y;
	exgcd(a,p,x,y);
	while(x<0)x+=p;
	return x;
}
ll mul(ll a,ll b){//快速乘  防止longlong 相乘会炸longlong
    ll ret=0;
    for(;b;b>>=1,a=(a<<1)%p)
      if(b&1) ret=(ret+a)%p;
    return ret%p;
}
void getans(){
	ans=p-1;
	for(ll i=p-1;i>q;i--){
		ans=mul(getinv(i),ans);//用快速乘
	}
}
void getprime(){//判断1e14内的质数,只需看有无1e7内的质数
	cntprime=0;
	for (ll i = 2; i <= 1e7; i++)
	{
    if (!flag[i]) prime[++cntprime] = i;
    for (int j = 1; j <= cntprime && prime[j] * i <= n; j++)
    {
        flag[i * prime[j]] = true;
        if (i % prime[j] == 0)
            break;
    }
	}
}
void getq(){//素数密度分布,素数分布的比较密集 			cout<<p-q<<endl;
//可以从大到小枚举,判断是否为质数,出现的比较快
	bool ok;
	for(ll i=p-2;i>=2;i--){
		ok=false;
		ll z=(long long)sqrt(i);
		for(int j=1;j<=cntprime&&prime[j]<=z;j++)if(i%prime[j]==0){ok=true;break;}
		if(!ok){q=i;return ;}
	}

}

int main(){
	int t;
	scanf("%d",&t);
	getprime();
	while(t--){
		scanf("%lld",&p);
		getq();
		getans();
		cout<<ans<<endl;
	}

	return 0;
}

威尔逊定理证明:https://blog.csdn.net/qq_36056315/article/details/83054665

原文地址:https://www.cnblogs.com/conver/p/11273386.html

时间: 2024-10-21 00:30:22

[hdu-6608] Fansblog 威尔逊定理 质数的密度分布 2019 多校 3的相关文章

HDU 5391 Zball in Tina Town【威尔逊定理】

<题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care about each other.Tina has a ball called zball. Zball is magic. It grows larger every day. On the first day, it becomes 1 time as large as its original siz

数论 (大数,小费马定理,欧拉定理,威尔逊定理,快速数论变换(NNT)模版)

1 Java大数 2 import java.util.*; 3 import java.math.*; 4 public class Main{ 5 public static void main(String args[]){ 6 Scanner cin = new Scanner(System.in); 7 BigInteger a, b; 8 9 //以文件EOF结束 10 while (cin.hasNext()){ 11 a = cin.nextBigInteger(); 12 b

数论&#183;威尔逊定理

威尔逊定理: $(p-1)!\equiv -1(\mod p)$当且仅当$p$为素数. 证明:在模p(素数)的简化剩余系$S = \{1, 2, ..., p - 1\}$中,对任意$i\in S$, $\exists j$, $ s.t.$,  $ij \equiv 1(\mod p)$, 考虑这种性质具有对称性,若${i^2}\equiv1(\mod p)$,则$i\equiv{\pm1}({\mod p})$,因此$(p-1)!\mod p = 1(p-1)\mod p = -1$.

【转】威尔逊定理

[转]威尔逊定理 威尔逊定理:,其中p为素数. 题目:给定一个正整数n,求表达式:的值. 分析:分两种情况讨论. (1)3k+7为素数时,那么由威尔逊定理知道,即 此时有,,所以 (2)3k+7为合数时,那么3k+7可以写成:,那么很明显a和b在(3k+6)!中都会出现, 所以,此时 所以,综上,问题就是小于等于n的数i中,存在多少个i,使得3i+7是素数.

[UVA1434] YAPTCHA(数论,威尔逊定理)

题目链接:http://acm.hust.edu.cn/vjudge/problem/36250 题意:求那个式子. 设3k+7=x,则化简成 Sn=Σ(k=1~n) (((x-1)!+1/x)-[(x-1)!/x]) 根据威尔逊定理,假如一个数p是素数,则这个数满足:(p-1)!=-1 (mod p)即 (p-1)!-1=0(mod p). 由于被减数满足此条件,而减数表示向下取整.则被减数整除,减数一定是向下取整的.所以结果减数比被减数要小1,否则减数和被减数相等,即为0.问题转换成了求3k

hdu5391 Zball in Tina Town(威尔逊定理)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 219    Accepted Submission(s): 144 Problem Description Tina Town i

hdu5391威尔逊定理

威尔逊定理 在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大. hdu5391用到了这一数论定理. Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s):

HDU 3864 D_num Miller Rabin 质数判断+Pollard Rho大整数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给出一个数N(1<=N<10^18),如果N只有四个约数,就输出除1外的三个约数. 思路:大数的质因数分解只能用随机算法Miller Rabin和Pollard_rho,在测试多的情况下正确率是由保证的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

威尔逊定理x

威尔逊定理 在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大. 充分性 如果“p”不是素数,那么它的正因数必然包含在整数1, 2, 3, 4, … ,p− 1 中,因此gcd((p− 1)!,p) > 1,所以我们不可能得到(p− 1)! ≡ −1 (modp). 必要性 若p是素数,取集合 A={1,2,3,...p -1}; 则A 构成模p乘法