HDU-6608
作者:互联网
题目:HDU-6608
题使用的数学思想:威尔逊定理+逆元+快速幂
威尔逊定理:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )。
逆元:x%mod/y%mod=x*pow(y,mod-2,mod);
题意:T组样例,给出一个P求出仅次于P的素数Q,
威尔逊定理:
(P-1)! ≡ -1(mod P)
推广为:Q!*(Q+1)*......*(P-2)*(P-1) ≡ -1(mod P);
Q!=-1(mod P)/(Q+1)*......*(P-2)*(P-1)
思路:使用暴力求出Q在使用威尔逊定理求出结果
注意:大数相乘会因为溢出出现问题。wa了N次祝你好运
AC-code:
#include
#include
using namespace std;
typedef long long ll;
ll Prime(ll X)
{
ll i,x=sqrt((double)(X+0.5));
for(i=2;i<=x;i++)
{
if(X%i==0)return 0;
}
return 1;
}
ll mult(ll A,ll B,ll Mod)
{
return (A*B-(ll)((long double)A*B/Mod)*Mod+Mod)%Mod;
}
ll pow(ll x,ll y,ll mod)
{
ll res=1;
while (y)
{
if(y%2)res=mult(res,x,mod);
y=y/2;x=mult(x,x,mod);
}
return res%mod;
}
int main()
{
ll P,Q,i;int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&P);
//暴力求Q
Q=P;
while(--Q)
{
if(Prime(Q))break;
}
//求Q+1.....P-1
ll ret=1;
for(i=Q+1;i
标签:HDU,ll,威尔逊,6608,定理,mod 来源: https://www.cnblogs.com/Vagrant-ac/p/11348787.html