您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1905 素数判断 + 二分

2010-08-07 22:53 477 查看
]/*
题目的意思很简单,就是求伪素数
wrong 之后就开始怀疑自己的算法有问题, 在别的oj交RE,
于是一直找不到错误。
有时候自信很重要的!!
*/
import java.util.*;
import java.io.*;
import java.math.*;
public class Main1905
{
static final int N = 40005;
static boolean hash[] = new boolean
;
static int prime[] = new int[N / 2];
static int p;
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
int pp, a;
Prime();
while(cin.hasNext())
{
pp = cin.nextInt();
a = cin.nextInt();
if(pp == 0 && a == 0)
break;
//if(!hash[pp] || oula(pp) == pp -1)
// 这里画蛇添足一直RE, 好久才检查差出来的
if(oula(pp) == pp - 1)
{
System.out.println("no");
continue;
} // 是素数的话输出 no
long temp = Erfen(a, pp, pp);
if((int)temp == a )
{
System.out.println("yes");
continue;
}
else
{
System.out.println("no");
continue;
}

}
}
static void Prime()
{
Arrays.fill(hash, (boolean)false);
int tt = (int)Math.sqrt(1.0 * N);
for(int i = 2; i < tt; i++)
if(!hash[i])
for(int j = 2; j * i < N; j++)
hash[i * j] = true;
p = 0;
for(int i = 2; i < N; i++)
if(!hash[i])
prime[p++] = i;
}

static long Erfen(int a, int n, int mod)
{
long b = 1;
long aa = a;
while(n > 0)
{
if(n % 2 ==  1)
{
n--;
b *= aa;
b %= mod;
}
else
{
aa *= aa;
aa %= mod;
n >>= 1;
}
}
return b;
}

static int oula(int n)
{
int temp = n;
int sum = n;
for(int i = 0; i < p; i++)
{
if(temp % prime[i] != 0)
continue;
if(prime[i] > temp)
break;
while(temp % prime[i] == 0)
{
temp /= prime[i];
}
sum = sum / prime[i] * (prime[i] - 1);
}
if(temp > 1)
sum = sum / temp * (temp - 1);
return sum;
}
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  import string class 算法