这是 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. day4-python基础

  2. 【数学】【背包】【NOIP2018】P5020 货币系统

    传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...

  3. 如何设置eclipse格式化xml代码时不自动换行

    如何设置eclipse格式化代码时不自动换行 2015年12月23日 09:08:36 qq_20889581 阅读数:3770 标签: eclipse格式化android 更多 个人分类: Ecli ...

  4. 【计算机视觉】SIFT中LoG和DoG比较

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 在实际计算时,三种方法计算的金字塔组数noctaves ...

  5. xcode禁用ARC(Automatic Reference Counting)

    Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译器的一项特性, ...

  6. Bootstrap 按钮下拉菜单

    向下拉 <div class="dropdown"> <button class="btn btn-default" data-toggle= ...

  7. OpenCV---色彩空间(一)

    颜色空间:用三种或者更多特征来指定颜色的方法,被称为颜色空间或者颜色模型 1.RGB(OpenCV中为BGR): 一幅图像由三个独立的图像平面或者通道构成:红.蓝.绿(以及可选项:透明度alpha通道 ...

  8. 动态加载js和css的jquery plugin

    一个简单的动态加载js和css的jquery代码,用于在生成页面时通过js函数加载一些共通的js和css文件. //how to use the function below: //$.include ...

  9. 【BZOJ】3495: PA2010 Riddle 2-SAT算法

    [题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...

  10. 通过删除hbase表中的region来达到删除表中数据

    公司最近在搞一个hbase删除数据,由于在建表的时候是通过region来对每日的数据进行存储的,所以要求在删除的时候直接通过删除region的来删除数据(最好的方案是只删除region中的数据,不把r ...