poj 1808 Quadratic Residues 二次剩余

 

/*

 * poj1808.c

 * Created on: 2011-10-12

 *  Author: bjfuwangzhu

 */

/*

 *> 考虑形如x2≡n(mod m)的同余式,其中m > 1,(m,n)=1。

 *> 若此同余式有解,则n称为模m的二次剩余;若此同余式无解,则n称为模m的二次非剩余。

 *> 设p是一个奇素数,则模p的二次剩余和二次非剩余个数正好是“一半对一半”,

 *> 下表给出几个较小的素数模的二次剩余和非剩余:

 *>  > p    剩余    非剩余 > 3    1    2 > 5    1,4    2,3 > 7

 *>  1,2,4    3,5,6 > 11    1,3,4,5,9    2,6,7,8,10 > 13

 *>  1,3,4,9,11,12    2,5,6,7,8,11 > 此外,

 *>  如果n是模p的二次剩余,则N^((p-1)/2)≡1(mod p) 。如果n是模p的二次非剩余,

 *>  则N^((p-1)/2)≡-1(mod p) 。 */

#include<stdio.h>

#define LL long long

int modular_exp(int a, int b, int c) {

	LL res, temp;

	res = 1 % c, temp = a % c;

	while (b) {

		if (b & 1) {

			res = res * temp % c;

		}

		temp = temp * temp % c;

		b >>= 1;

	}

	return (int) res;

}

void solve(int a, int p) {

	a = (a % p + p) % p;

	if (modular_exp(a, (p - 1) / 2, p) == 1) {

		puts("1");

		return;

	}

	puts("-1");

}

int main() {

#ifndef ONLINE_JUDGE

	freopen("data.in", "r", stdin);

#endif

	int t, i, a, p;

	scanf("%d", &t);

	for (i = 1; i <= t; i++) {

		scanf("%d %d", &a, &p);

		printf("Scenario #%d:\n", i);

		solve(a, p);

		printf("\n");

	}

	return 0;

}

你可能感兴趣的:(poj)