这是 meelo 原创的 IEEEXtreme极限编程大赛题解

Xtreme 10.0 - Goldbach's Second Conjecture

题目来源 第10届IEEE极限编程大赛

https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/goldbachs-second-conjecture

An integer p > 1 is called a prime if its only divisors are 1 and p itself. A famous conjecture about primes is Goldbach's conjecture, which states that

Every even integer greater than 2 can be expressed as the sum of two primes.

The conjecture dates back to the year 1742, but still no one has been able to come up with a proof or find a counterexample to it. We considered asking you prove it here, but realized it would be too easy. Instead we present here a more difficult conjecture, known as Goldbach's second conjecture:

Every odd integer greater than 5 can be expressed as the sum of three primes.

In this problem we will provide you with an odd integer N greater than 5, and ask you to either find three primes p1p2p3 such that p1 + p2 + p3 = N, or inform us that N is a counterexample to Goldbach's second conjecture.

Input Format

The input contains a single odd integer 5 < N ≤ 1018.

Output Format

Output three primes, separated by a single space on a single line, whose sum is N. If there are multiple possible answers, output any one of them. If there are no possible answers, output a single line containing the text "counterexample" (without quotes).

Sample Input

65

Sample Output

23 31 11

Explanation

In the sample input N is 65. Consider the three integers 11, 23, 31. They are all prime, and their sum is 65. Hence they form a valid answer. That is, a line containing "11 23 31", "23 31 11", or any permutation of the three integers will be accepted. Other possible answers include "11 37 17" and "11 11 43".

题目解析

将一个奇数分解为三个质数,奇数最大有1018。可以遍历前两个质数,然后判断奇数与两个质数的差是否仍未质数。如果3个质数都有1017,那么肯定会超时。

事实上是,存在解前两个质数都不超过1000。这个时候关键的问题成为了,如何判断一个规模有1018的数为质数。常规的方法复杂度为O(sqrt(n)),会超时。这时候需要一点数论的知识,Miller–Rabin质数测试能够在O((logn)2)判断一个数是否为质数。算法在维基百科详细的介绍。下面程序里的Miller–Rabin质数测试使用的是github上的代码。

程序

C++

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std; #define MAXN 1000
typedef unsigned long long ULL;
typedef long long LL; bitset<MAXN> nums;
int primes[MAXN];
int num_prime = ; void getPrimes(long long max) { // get all primes under max
for(int i=; i<=sqrt(max+0.5); i++) {
if(nums[i] == false) {
primes[num_prime] = i;
num_prime++;
for(long long n=*i; n<max; n+=i) {
nums[n] = true;
}
}
}
for(int i=int(sqrt(max+0.5))+; i<max; i++) {
if(nums[i] == false) {
primes[num_prime] = i;
num_prime++;
}
}
} LL MultiplyMod(LL a, LL b, LL mod) { //computes a * b % mod
ULL r = ;
a %= mod, b %= mod;
while (b) {
if (b & ) r = (r + a) % mod;
b >>= , a = ((ULL) a << ) % mod;
}
return r;
}
template<typename T>
T PowerMod(T a, T n, T mod) { //computes a^n % mod
T r = ;
while (n) {
if (n & ) r = MultiplyMod(r, a, mod);
n >>= , a = MultiplyMod(a, a, mod);
}
return r;
}
template<typename T>
bool isPrime(T n) {
//determines if n is a prime number using Miller–Rabin primality test
// from https://github.com/niklasb/tcr/blob/master/zahlentheorie/NumberTheory.cpp
const int pn = , p[] = { , , , , , , , , };
for (int i = ; i < pn; ++i)
if (n % p[i] == ) return n == p[i];
if (n < p[pn - ]) return ;
T s = , t = n - ;
while (~t & )
t >>= , ++s;
for (int i = ; i < pn; ++i) {
T pt = PowerMod<T> (p[i], t, n);
if (pt == ) continue;
bool ok = ;
for (int j = ; j < s && !ok; ++j) {
if (pt == n - ) ok = ;
pt = MultiplyMod(pt, pt, n);
}
if (!ok) return ;
}
return ;
} int main() {
long long n;
cin >> n; getPrimes(MAXN); for(int i=; i<num_prime; i++) {
for(int j=i; j<num_prime; j++) {
if(isPrime(n-primes[j]-primes[i])) {
printf("%lld %lld %lld", primes[i], primes[j], n-primes[i]-primes[j]);
return ;
} }
} return ;
}

博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址

IEEEXtreme 10.0 - Goldbach's Second Conjecture的更多相关文章

  1. IEEEXtreme 10.0 - Inti Sets

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...

  2. IEEEXtreme 10.0 - Painter's Dilemma

    这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...

  3. IEEEXtreme 10.0 - Ellipse Art

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...

  4. IEEEXtreme 10.0 - Counting Molecules

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...

  5. IEEEXtreme 10.0 - Checkers Challenge

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...

  6. IEEEXtreme 10.0 - Game of Stones

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...

  7. IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...

  8. IEEEXtreme 10.0 - Full Adder

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...

  9. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...

随机推荐

  1. c++多态性详解(转)

    什么是多态? 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,当然这只是字面意思,它在C++语言中多态有着更广泛的含义. 这要先从对象的类型说起!对象的类型有两种: 实例:Derived1类 ...

  2. 一些常见算法的JavaScript实现

    在Web开发中,JavaScript很重要,算法也很重要.下面整理了一下一些常见的算法在JavaScript下的实现,包括二分法.求字符串长度.数组去重.插入排序.选择排序.希尔排序.快速排序.冒泡法 ...

  3. 【OpenCV】特征检测器 FeatureDetector

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html OpenCV提供FeatureDetector实现特征 ...

  4. js浏览器调试方法

    chrome浏览器可在需要断点的地方写一个关键字 "debugger",这样在 js 运行到这里的时候会停止继续运行,并可以查看当前状态

  5. jre,jdk,jvm的关系

    今天在用maven搭建项目工程的时候出错的原因竟然是因为使用了jre,而非jdk导致报错,这里就搜集了有关这方面的信息:   JDK(Java Development Kit)是针对Java开发员的产 ...

  6. Kubernetes 1.5部署sonarqube

    前面几篇博文我们一直在说kubernetes的基础环境的安装及部署.在基础环境部署完成以后,我们开始尝试使用kubernetes来管理我们的应用.本篇博文通过一个简单的示例来向大家展示如何通过depl ...

  7. SQL Server 2008如何开启数据库的远程连接

    SQL Server 2008默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远程连接数据库.需要做两个部分的配置: 1,SQL Server Man ...

  8. windows7中用vitualbox安装OS X 10.11 El Capitan 及 Xcode 7.0--转载

    在 Win 7或8 下使用 VirtualBOX 虚拟机安装 OS X 10.11 El Capitan 及 Xcode 7.0 来源:http://bbs.feng.com/read-htm-tid ...

  9. js闭包及问题的解决

    闭包定义,作用 闭包就是能够读取其他函数内部变量的函数. 作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中 缺点:闭包会保存函数中的变量在内存中,导致内存消耗大   闭包会 ...

  10. Centos下 自动化配置SSH免密码登陆

    hosts文件,存储要部署的节点IP地址,其中以#开头表示注释掉 192.168.101.52 192.168.101.53 192.168.101.54 192.168.101.55 192.168 ...