UVA 1415 - Gauss Prime(数论,高斯素数拓展)

UVA 1415 - Gauss Prime

题目链接

题意:给定a + bi,推断是否是高斯素数,i = sqrt(-2)。

思路:普通的高斯素数i = sqrt(-1),推断方法为:

1、假设a或b为0。推断还有一个数为4 * n + 3形式的素数(用到费马平方和定理)

2、假设a、b都不为0,推断a ^ 2 + b ^ 2 是否为素数

那么这题,提取出sqrt(2)来,就和基本情况一样了。

对于2,变成: 假设a、b都不为0,推断a ^ 2 + 2 b ^ 2是否为素数

对于1。事实上仅仅要a = 0,b始终能够拆成两个数相乘了,就不是高斯素数了

。这样一来问题就攻克了

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>

const int N = 20005;
int t, a, b, prime[N], pn = 0, vis[N];

bool judge() {
    if (a == 0)
	return false;
    int tmp = a * a + 2 * b * b;
    for (int i = 0; i < pn && prime[i] < tmp; i++)
	if (tmp % prime[i] == 0) return false;
    return true;
}

int main() {
    vis[1] = 1;
    for (int i = 2; i < N; i++) {
	if (vis[i]) continue;
	prime[pn++] = i;
	for (int j = i * i; j < N; j += i) {
	    vis[j] = 1;
	}
    }
    scanf("%d", &t);
    while (t--) {
	scanf("%d%d", &a, &b);
	printf("%s\n", judge()?"Yes":"No");
    }
    return 0;
}
时间: 2024-11-07 12:29:44

UVA 1415 - Gauss Prime(数论,高斯素数拓展)的相关文章

uva 1415 - Gauss Prime(高斯素数)

题目链接:uva 1415 - Gauss Prime 题目大意:给出一个a,b,表示高斯数a+bi(i=?2 ̄ ̄ ̄√,推断该数是否为高斯素数. 解题思路: a = 0 时.肯定不是高斯素数 a != 0时,推断a2+2b2是否为素数就可以. #include <cstdio> #include <cstring> #include <cmath> bool is_prime (int n) { int m = sqrt(n+0.5); for (int i = 2;

UVA - 1415 Gauss Prime

Description In the late 1700s', Gauss, a famous mathematician, found a special kind of numbers. These integers are all in the form: a + b .The sum and multiplication ofthese integers can be naturally defined as the follows: (a + b) + (c + d) = (a + c

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

uva 10539 - Almost Prime Numbers(数论)

题目链接:uva 10539 - Almost Prime Numbers 题目大意:给出范围low~high,问说在这个范围内有多少个数满足n=pb,(p为素数). 解题思路:首先处理出1e6以内的素数,然后对于每个范围,用solve(high)?solve(low?1),solve(n)用来处理小于n的满足要求的数的个数.枚举素数,判断即可. #include <cstdio> #include <cstring> typedef long long ll; const int

UVA 10139 Factovisors(数论)

Factovisors The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * (n-1)! (n > 0) We say that a divides b if there exists an integer k such that k*a = b The input to your program consists of several lines, each conta

uva 11105 - Semi-prime H-numbers(数论)

题目链接:uva 11105 - Semi-prime H-numbers 题目大意:H-number为4?k+1(k为非负数),H-composites为因子中含有H-number(不包括自己本身)的数,反之久是H-prime,给定n,求有多少H-composites. 解题思路:首先用筛选法求出范围内的H-prime,然后枚举两个判断乘积是否在范围内. #include <cstdio> #include <cstring> const int maxn = 1e6+5; ty

UVA 718 - Skyscraper Floors(数论)

UVA 718 - Skyscraper Floors 题目链接 题意:在一个f层高的楼上,有e个电梯,每个电梯有x,y表示y + k * x层都可以到,现在要问从a层能否到达b层(中间怎么换乘电梯不限制) 思路:对于两个电梯间能不能换乘,只要满足y[i] + xx x[i] == y[j] + yy y[j].然后移项一下,就可以用拓展欧几里得求解,进而求出x,y的通解,然后利用通解范围x' >= 0, y' >= 0, x[i] x' + y[i] <= f, x[j] y' + y

uva 11610 Reverse Prime

Problem FReverse Prime Input: Standard Input Output: Standard Output There are a few 7 digit positive numbers whose reverse number is a prime number and less than 10^6.  For example: 1000070, 1000090 and 1000240 are first few reverse prime numbers be

uva 718 - Skyscraper Floors(数论+bfs)

题目链接:uva 718 - Skyscraper Floors 题目大意:一栋大楼,有F层楼,E个电梯,现在要从A层到B层,问是否可行,每个电梯给出Xi和Yi,代表这个电梯可以到达的层数Yi+k?Xi(k≥0) 解题思路:建图,以A,B以及电梯为节点建图,将可以到达A,B这两层的电梯与这两点建边,在将两两电梯可以达到同一层的建边,判断方法为:Yi+aXi=Yj+bXj,移项得:aXi+bXj=Yj?Yi,即是一个线性方程,用拓展欧几里得算法求出通解的形式,判断是否存在通解在0~F之间即可. #