复素数Prime Judge(新生归来赛B题)
来源:互联网 发布:openwrt ip mac绑定 编辑:程序博客网 时间:2024/06/11 01:25
在此先感谢丁神一下,多谢丁神点播!!!顺便推广下丁神博客h
这道题,我头疼了一下午,真是都已经抓狂了,后来去请教了下丁神,才搞明白了,原来搞明白后是这么地简单。。O(∩_∩)O哈哈~,鉴于看丁神的样子,没有写题解的意思,我又为这道题头疼了好久(找了半天也找不到题解),那我今天就为这道题写一下题解吧!嘿嘿,写的不好的还望多多指教。。
好了,废话少说,进入正题。
这道题,在buaa的OJ上也有类似的,题目如下(这里是我们OJ上的题目,跟BUAA的略有不同,不过整体上昰一样的),
397. Prime Judge
时间限制 1000 ms 内存限制 65536 KB题目描述
众所周知,如果一个正整数只能被1和自身整除,那么该数被称为素数。题目的任务很简单,就是判定一个数是否是一个素数。 只不过可能数的形式与正整数有一些不同,数的形式为a+bi,其中a、b为整数,且ii被定义为-1。如果a+bi能被分解为(a1+b1i)(a2+b2i)的形式,那么该数不是素数;否则,该数是素数。其中a1 、b1、 a2 、b2均为整数,且1,-1,0,i,-i不能作为被分解的因子。 注意,1,-1,0,i,-i均不为素数。
输入格式
输入包括若干组数据,每行包含2个数a、b,表示一个形如a+bi的数。a,b小于10000。
输出格式
对应于输入每行,如果输入的数为素数,则输出“YES”,否则输出“NO”。(不包括引号)
输入样例
-10 23 0
输出样例
NOYES
首先,复数 a+bi 是二维的,这个让人感觉很蛋疼,跟蛋疼的是这个a,b还都有可能是负数,怎么样做一个变换使得可以用一维的一个数来表示呢?我不知道什么定理,就是在草稿上列了好多的式子,过程如下: (a1+b1i)(a2+b2i)=(a1a2-b1b2)+(a1b2+a2b2)i 设m=a1a2-b1b2,n=a1b2+a2b1 那么就有m+ni=(a1+b1i)(a2+b2i),然后观察m,n中都含有a1,a2,b1,b2两两的乘积,那么我就考虑平方一下会如何?于是我就用m^2+n^2=(a1a2)^2+(b1b2)^2+(a1b2)^2+(a2b1)^2,整理了一下,提取公因式,结果发现m^2+n^2=(a1^2+b1^2)(a2^2+b2^2),而且平方之后,a,b的正负就无所谓了(我就做到这里了,然后就不知道怎么办了) 接下来,我想过类比筛素法,可是10^8的判断数组是肯定开不起的,想过把所有的平方和都存起来,可是又发现10^8以内的平方和实在是太多了,还有其他好多行不通的想法,反正就是死死地卡在这里了。后来,经丁神点播,知道了一种很简单的思路。 首先,让我们先来证明一下一个定理,n是一个平方和 <==> 2n是一个平方和。 先来证明充分性, 设n=(a^2+b^2) 那么 2n=(a^2+b^2+a^2+b^2)=(a+b)^2+(a-b)^2,证毕;再来证明必要性, 2n是一个平方和,它也一定是一个偶数,那么设2n=a^2+b^2,由于2n是偶数,则a^2,b^2的奇偶性必然相同,则n=(a^2+b^2)/2=((a+b)^2+(a-b)^2)/4=((a+b)/2)^2+((a-b)/2)^2,由于a,b奇偶性必然相同,所以,a+b和a-b必然都是偶数,所以(a+b)/2,(a-b)/2都是整数,所以n也是平方和,证毕。 有了以上的定理,判断一个数是否是平方和就非常简单了,假设数n是平方和,那么,如果n为偶数的话,就有(n=n/2)也是平方和。一直除到n为奇数为止,此时n必然也是平方和,那么n必然是 一个奇数的平方 + 一个偶数的平方,而奇数的平方为(2k+1)^2=4k+4k^2+1, 它 mod 4==1;而同理,也可得 偶数的平方 mod 4==0;综合以上两点,就有 n(n为奇数且n为平方和),那么n mod 4== 0+1=1(奇数对4取余只能是1或者3),所以,如果反之,除2至奇数的 n mod 4==3 的话,那么原来的n就不是平方和。 有了以上的基础,这道题就变得十分简单了。首先,把给的数a,b求平方和, sp=a^2+b^2 (我取的squarePlus的缩写),之后将sp分解,跟求素数时一个道理,只需要枚举到 根号sp就行。然后再看分解的两个数是否都是平方和,如果存在分解的两个数都是平方和的情况,那么所给的数就不是素数,否则就是素数。下面贴代码。#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
long long a,b;
while (~scanf("%lld%lld",&a,&b))
{
long long sp=a*a+b*b;
bool judge=false;
for (int i=2;i<=sqrt(sp);i++)
{
if (sp%i!=0) continue;
int j=sp/i;
while (i%2==0) i/=2;
while (j%2==0) j/=2;
if (i%4==1&&j%4==1)
{
judge=true;
break;
}
}
if (sp==1||sp==0) judge=true;
if (judge) printf("NO\n");
else printf("YES\n");
}
}注:buaa的题目中,是没有提到 0 0 这种情况的。。好了,再次拜丁犇。。。(我很奇怪,为啥这次代码没有格式!? ╮(╯﹏╰)╭)
397. Prime Judge
时间限制 1000 ms 内存限制 65536 KB
题目描述
众所周知,如果一个正整数只能被1和自身整除,那么该数被称为素数。题目的任务很简单,就是判定一个数是否是一个素数。 只不过可能数的形式与正整数有一些不同,数的形式为a+bi,其中a、b为整数,且ii被定义为-1。如果a+bi能被分解为(a1+b1i)(a2+b2i)的形式,那么该数不是素数;否则,该数是素数。其中a1 、b1、 a2 、b2均为整数,且1,-1,0,i,-i不能作为被分解的因子。 注意,1,-1,0,i,-i均不为素数。
输入格式
输入包括若干组数据,每行包含2个数a、b,表示一个形如a+bi的数。a,b小于10000。
输出格式
对应于输入每行,如果输入的数为素数,则输出“YES”,否则输出“NO”。(不包括引号)
输入样例
-10 23 0
输出样例
NOYES
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
long long a,b;
while (~scanf("%lld%lld",&a,&b))
{
long long sp=a*a+b*b;
bool judge=false;
for (int i=2;i<=sqrt(sp);i++)
{
if (sp%i!=0) continue;
int j=sp/i;
while (i%2==0) i/=2;
while (j%2==0) j/=2;
if (i%4==1&&j%4==1)
{
judge=true;
break;
}
}
if (sp==1||sp==0) judge=true;
if (judge) printf("NO\n");
else printf("YES\n");
}
}
0 0
- 复素数Prime Judge(新生归来赛B题)
- bupt2014暑假新生归来赛(1)
- 7.12-2014新生归来赛
- 20161217湘潭大学新生赛B题
- POJ 3518 Prime Gap(素数题)
- Prime Gap (素数)
- B题 素数(筛法求素数)
- 2014北邮新生归来赛解题报告a-c
- 2014北邮新生归来赛解题报告d-e
- GDUT新生赛—B
- XTU新生赛B题 ABK 解题报告
- 浙江理工大学新生赛 B 巴比伦花园(RMQ)(二分)
- [SinGuLaRiTy-1002] Miller Rabin Prime Judge 米勒·罗宾素数判定法
- prime judge(HOJ1356)
- Hoj 1356 Prime Judge
- EOJ 1094 Prime Judge
- python judge prime number
- BOJ 397. Prime Judge
- [ACM] POJ 1753 Flip Game (枚举,BFS,位运算)
- Android - 开发实例(15):变色SystemBar
- 关于浮动的前世今生
- CSS学习一
- Hadoop计算中的Shuffle过程
- 复素数Prime Judge(新生归来赛B题)
- J - Vertical Histogram(1.5.7)
- [CF 239B][BNUOJ 26625] King's Path [模拟]
- android一些系统相关的东西
- 一周一研究---- circular-progress-button
- 一个长度为A的无序数组,找到中位数
- Java SE 详细笔记
- 最大子数组
- I - Dirichlet's Theorem on Arithmetic Progressions(1.5.5)