solution = 0
N = 0
while N < 1000:
    if (N % 3 == 0) or (N % 5 == 0):
        solution = solution + N
    N+=1
print solution

"""
Explanation: Q001
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
Solution
The condition of a number N being multiples of 3 is N % 3 == 0. Similar for multiples of 5.
End of explanation
"""


s=0
a=1
b=1
while b < 4E6:
    if b % 2 ==0: s=s+b; 
    c=a+b
    a=b
    b=c
print s

"""
Explanation: Q002
Even Fibonacci numbers
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
End of explanation
"""


n=600851475143 #13195
a=2
while not a > n:
    if n%a:
        a+=1
    else:
        n//=a
print a

"""
Explanation: Q003
Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
End of explanation
"""


a=999
b=999
while a>100 and b>100:
    c = a*b
    if str(c) == str(c)[::-1]:
        print a,"*",b,"=",c
        break
    a=a-1
    b=b-1

"""
Explanation: Q004
Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
End of explanation
"""


#brute force
n=2520
l=n*11*12*13*14*15*16*17*18*19
while n<l:
    reminder=[n % (i+1) for i in range(20)]
    if sum(reminder) == 0:
        print n
        break
    n=n+1

# 1*2*3*4*5*7*3=2520
# prime number: must be a factor
# composite number: factorize and remove smaller prime number
def is_prime(n):
    if n < 1:
        return False
    elif n < 4:
        return True
    elif (n % 2 == 0) or (n % 3 == 0):
        return False
    i = 5
    while i*i < n + 1:
        if (n % i == 0):
            return false
        i=i+1
    #while i*i < n + 1:
    #    if (n % i == 0) or (n % (i + 2) == 0):
    #        return False
    #    i = i + 6
    return True

def prime_factors(n):
    i = 2
    factors = []
    while i * i <= n:
        if n % i:
            i += 1
        else:
            n //= i
            factors.append(i)
    if n > 1:
        factors.append(n)
    return factors

fac=[]
for i in range(20):
    if is_prime(i+1):
        fac.append(i+1)
    else:
        test=fac[:]
        for p in prime_factors(i+1):
            if p in test:
                test.remove(p)
            else:
                fac.append(p)
print fac
product = 1
for x in fac:
    product *= x
print product

"""
Explanation: Q005
Smallest multiple
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
End of explanation
"""


sum_of_the_square = sum([i*i for i in range(1,100+1)])
square_of_the_sum = sum(range(1,100+1))
square_of_the_sum = square_of_the_sum*square_of_the_sum
print square_of_the_sum - sum_of_the_square

"""
Explanation: Q006
Sum square difference
The sum of the squares of the first ten natural numbers is,
$1^2 + 2^2 + ... + 10^2 = 385$
The square of the sum of the first ten natural numbers is,
$(1 + 2 + ... + 10)^2 = 55^2 = 3025$
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
End of explanation
"""


def is_prime(n):
    if n < 2:
        return False
    elif n < 4:
        return True
    elif (n % 2 == 0) or (n % 3 == 0):
        return False
    i = 5
    while i*i < n + 1:
        if (n % i == 0):
            return False
        i=i+1
    return True

i=1
count_prime=0
while count_prime<10001:
    i+=1
    if is_prime(i):
        count_prime+=1
print i,"#",count_prime
        

"""
Explanation: Q007
10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
End of explanation
"""


s='''73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''
import re
s=re.sub("[^0-9]", "", s)
#ss = [s[i:i+13] for i in range(len(s)-12)]
#print ss[-1]
maxproduct=1
for i in range(len(s)-12):
    ss = map(int,s[i:i+13])
    product = 1
    for x in ss:
        product *= x
    if product > maxproduct:
        maxproduct=product
print maxproduct

"""
Explanation: Q008
Largest product in a series
The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?
End of explanation
"""


# By substituting c=1000-(a+b) into Pythagorean equality, we get
# n^2 = 2n(a+b) - 2ab, n=1000 here

def f(a,b,n):
    return 2*n*(a+b) - 2*a*b - n*n

import numpy as np
n=1000
X,Y=np.meshgrid(range(1,n),range(1,n))
X=np.tril(X,-1).ravel()
Y=np.tril(Y,-1).ravel()
for p in zip(X[X>0],Y[Y>0]):
    if f(p[0],p[1],n) == 0:
        print p[0],p[1], n-p[0]-p[1]
        print p[0]*p[1]*(n-p[0]-p[1])

"""
Explanation: Q009
Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, $a < b < c$, for which,
$a^2 + b^2 = c^2$
For example, $3^2 + 4^2 = 9 + 16 = 25 = 5^2$.
There exists exactly one Pythagorean triplet for which $a + b + c = 1000$.
Find the product abc.
End of explanation
"""


def is_prime(n):
    if n < 2:
        return False
    elif n < 4:
        return True
    elif (n % 2 == 0) or (n % 3 == 0):
        return False
    i = 5
    while i*i < n + 1:
        if (n % i == 0) or (n % (i + 2) == 0):
            return False
        i = i + 6
    return True

i=1
s=0
while i<2e6:
    i+=1
    if is_prime(i):
        s+=i
print i,"SUM",s

"""
Explanation: Q010
Summation of primes
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
End of explanation
"""


