二次剩余求解问题
对应 的解。
应用:可以用 表示 下的值。
先上个代码,有时间再开坑。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+9;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
ll ksm(ll a,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
ll Qres(ll a){ //求解a模p下的二次剩余对应的x的解.
if(!a) return 0;
ll b=(rand()<<14^rand())%mod;//随机模p下的二次非剩余
while(ksm(b,(mod-1)/2)!=mod-1) b=(rand()<<14^rand())%mod;
ll s=mod-1,t=0,inv=ksm(a,mod-2),f=1;
while(s%2==0) s>>=1,t++,f<<=1;
ll x=ksm(a,(s+1)/2);t--,f>>=1;
while(t){
f>>=1;
if(ksm(x*x%mod*inv%mod,f)!=1) x=x*ksm(b,s)%mod;
t--,s<<=1;
}
return min(x,mod-x);
}
int main(){
printf("%lld\n",Qres(5));
return 0;
}