Problem Description :
It is possible to write ten as the sum of primes in exactly five different ways:
7 + 3
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2
What is the first value which can be written as the sum of primes in over five thousand different ways?
Solution :At first I have tried to find out the solution using primes bellow 1 million. But the ans is 71. So we have to generate primes up to 100(roughly). Then using these number and a special computing technique called coin change logic which is one kind of dynamic programming paradigm, we can solved this problem.
Here every primes up to 100 is a coin. Now the question is for which key we can add up coins over five hundred ways. See implementation for this idea.
Here is the C++ implementation of the problem.
#include <cstdio> #include <iostream> #include <cmath> using namespace std; #define sz 101 #define mx 11 bool p[sz]; int primeTable[50],nPrime = 0,ans[sz]; void sieve(){ int i,j; p[0] = p[1] = true; for( i = 4; i <= sz; i += 2 ) p[i] = true; primeTable[nPrime++] = 2; for( i = 3; i <= mx; i += 2 ){ if(!p[i]){ primeTable[nPrime++] = i; for( j = i * i; j <= sz; j += i ) p[j] = true; } } for( i = mx + 2; i <= sz; i += 2 ){ if(!p[i]){ primeTable[nPrime++] = i; } } } int main(){ long i,cnt = 0,high,key,j; bool f = true; sieve(); ans[0] = 1; for(i = 0; i < nPrime && f; i++){ high = 100 - primeTable[i]; for(j = 0; j < high; j++){ if(ans[j]){ ans[j+primeTable[i]] += ans[j]; } } } for(i = 0; i < 100; i++){ if(ans[i] >= 5000){ printf("%ld\n",i); break; } } return 0; }
No comments:
Post a Comment