poj 3641

用了一些二分的思想。要不会超时。

还要注意一点,问的是非素数的p是否是伪素数

//============================================================================
// Name        : 3641.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

long long p, a, ans;
long long t = 0;

long long isprime(long long m){
	for(int i = 2;i <= sqrt(m);i++){
		if(m%i == 0) return 0;
	}
	return 1;
}


long long powmod(long long m){
	long long temp = 1;
	if(m > 100){
	    long long t0 = powmod(m/2);
		temp = (temp*t0)%p;
            temp = (temp*t0)%p;
        if(m%2 != 0)
            temp = (temp*a)%p;
	}
	else{
		for(int i = 1;i <= m;i++){
			temp = (temp*a)%p;
			++t;
		}
	}
	return temp;
}



int main() {
	freopen("a.txt", "r", stdin);
	while(scanf("%lld%lld", &p, &a)&&(p||a)){
		if(isprime(p)){
			printf("no\n");
			continue;
		}
		ans = powmod(p);
		if(ans == a){
			printf("yes\n");
		}
		else printf("no\n");
	}
	return 0;
}

  

posted @ 2011-07-24 16:44  KOKO's  阅读(231)  评论(0编辑  收藏  举报