现在的位置: 首页 > 综合 > 正文

poj 1808 Quadratic Residues 二次剩余

2012年09月17日 ⁄ 综合 ⁄ 共 812字 ⁄ 字号 评论关闭

 

/*
 * 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;
}

抱歉!评论已关闭.