Jacobi symbolTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 549 Accepted Submission(s): 207
Problem Description
Consider a prime number p and an integer a !≡ 0 (mod p). Then a is called a quadratic residue mod p if there is an integer x such that x2 ≡ a (mod p), and a quadratic non residue otherwise. Lagrange introduced the following notation, called the Legendre
symbol, L (a,p):
For the calculation of these symbol there are the following rules, valid only for distinct odd prime numbers p, q and integers a, b not divisible by p: The Jacobi symbol, J (a, n) ,is a generalization of the Legendre symbol ,L (a, p).It defines as : 1. J (a, n) is only defined when n is an odd. 2. J (0, n) = 0. 3. If n is a prime number, J (a, n) = L(a, n). 4. If n is not a prime number, J (a, n) = J (a, p1) *J (a, p2)…* J (a, pm), p1…pm is the prime factor of n.
Input
Two integer a and n, 2 < a< =106,2 < n < =106,n is an odd number.
Output
Output J (a,n)
Sample Input
3 5
3 9
3 13
Sample Output
-1
0
1
Author
alpc41
Source
Recommend
|
題意:
求J(a,n)
解題思路:
二次剩餘,歐拉準則!
在數論中,特別在同餘理論裏,一個整數 對另一個整數 的二次剩餘(英語:Quadratic residue)指 的平方 除以 得到的餘數。
當對於某個及某個,式子 成立時,稱“是模的二次剩餘”
當對於某個及某個, 不成立時,稱“是模的二次非剩餘”
歐拉準則:
若是奇質數且不能整除,則:
- 是模的二次剩餘當且僅當:
- 是模的非二次剩餘當且僅當:
以勒讓德符號表示,即爲:
AC代碼:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN = 1000000+10;
typedef long long LL;
bool is_prime[MAXN];
int prime[MAXN];
void init()
{
int tot=0;
is_prime[0]=is_prime[1]=true;
for(int i=2;i<MAXN;i++){
if(!is_prime[i]){
prime[tot++]=i;
for(int j=i+i;j<MAXN;j+=i){
is_prime[j]=true;
}
}
}
}
int fast_power(int a,int n,int M)
{
LL res=1;
LL x=a;
while(n){
if(n&1) res=res*x%M;
x=x*x%M;
n>>=1;
}
return res%M;
}
int solve(int a,int p)
{
if(a%p==0) return 0;
return fast_power(a,(p-1)/2,p)==1?1:-1;
}
int main ()
{
int a,n;
init();
while(scanf("%d%d",&a,&n)!=EOF){
int ans=1;
if(is_prime[n]){
for(int i=0;prime[i]<=n;i++){
if(n%prime[i]) continue;
int cnt=0;
while(n%prime[i]==0){
n/=prime[i];
cnt++;
}
int t=solve(a,prime[i]);
if(t==-1&&cnt%2==0) t=1;
ans*=t;
}
}
else ans=solve(a,n);
printf("%d\n",ans);
}
return 0;
}