IEEEXtreme 10.0 - Goldbach's Second Conjecture
这是 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 p1, p2, p3 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的更多相关文章
- IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...
- IEEEXtreme 10.0 - N-Palindromes
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...
随机推荐
- Howto run google-chrome as root
Just want to add a permanent solution to the problem: 1. Open google-chrome located in /usr/bin with ...
- activiti学习-用户与用户组
activiti学习笔记3-用户与用户组 2015年05月07日 14:43:06 cq1982 阅读数:4142更多 个人分类: activiti工作流引擎 (本博客都是纯文本手工代码,错误难免 ...
- Lua弱表Weak table
定义:弱表的使用就是使用弱引用,很多程度上是对内存的控制. 1.weak表示一个表,它拥有metatable,并且metatable定义了__mode字段. 2.弱引用不会导致对象的引用计数变化.换言 ...
- gflag使用
#include <gflags/gflags.h> #include <iostream> // 声明全局flag DEFINE_bool(my_bool, false, & ...
- Bootstrap 按钮下拉菜单
向下拉 <div class="dropdown"> <button class="btn btn-default" data-toggle= ...
- IBatisNet+Oracle.ManagedDataAccess打造无需安装oracle客户端和ODP即可连接oracle数据库
库环境: Oracle.ManagedDataAccess 版本:4.122.1.0 IBatisNet 版本:1.6.2 其实很简单的,只需在驱动配置那里添加上Oracle.ManagedData ...
- "Access restriction: The type BASE64Encoder is not accessible due to restrict"问题解决
问题如题: Eclipse中有一种叫做存取限制的机制,来防止你错误使用那些非共享的API.通常来说,Eclipse做的是对的,因为两点,我们不想要使用非共享API的,而且Eclipse知道什么是共享的 ...
- JS中client/offset/scroll等的宽高解析
原文地址:→传送门 window相关宽高属性 1. window.outerHeight (窗口的外层的高度) / window.outerWidth (窗口的外层的宽度) window.outerH ...
- 在vm上面安装Linux系统
1 在vm上面安装Linux系统 1 以管理员的身份运行VMware: 点击VM图标然后右键属性 ,点兼容性 ---特权 等级 选择 以管理员的身份运行此软件 2 . 添加一个虚 ...
- MySQL的连接类型
首先我们来创建两个数据表: 结构: 我们用内连接来查看一下: select * from test1 join test2 on test1.aid=test2.aid; 由于内连接是等值连接,所 ...