project_euler

#12.py

from math import sqrt,floor

def main():
    i = 1
    while True:
        yield i*(i+1)//2
        i += 1

def count(x):
    count = 0
    if sqrt(x) == float(floor(sqrt(x))):
        for i in range(1,int(sqrt(x))):
            if x%i == 0:
                count += 2
        count += 1
        return count
    else:
        for i in range(1,int(sqrt(x))):
            if x%i == 0:
                count += 2
        return count

for i in main():
    if count(i) > 500:
        print(i)
        break

#14.py

count = 0
def collatz(n):
    global count
    if n == 1:
        var = count
        count = 0
        return var
    elif n%2 == 0:
        count += 1
        return collatz(n//2)
    else:
        count += 1
        return collatz(3*n+1)


var = [3,collatz(3)]
for i in range(1,10**6):
    if collatz(i) > var[1]:
        var = [i,collatz(i)]
    else:
        continue

print(var)

#15.py

def path(x,y):
    if x == 0 and y == 0:
        return 0
    elif x == 0 and y != 0:
        return y
    elif y == 0 and x != 0:
        return x
    else:
        return path(x-1,y) + path(x,y-1)

print(path(20,20))

##from math import comb
##print(comb(40,20))

#16.py

a = 2**10
for i in range(0,2):
   a = a**10
sum = 0
for i in str(a):
    sum += int(i)

print(sum)

#17.py

dict1 = { 0:'', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine'}
dict2 = { 0:'', 2:'twenty', 3:'thirty', 4:'forty', 5:'fifty', 6:'sixty', 7:'seventy', 8:'eighty', 9:'ninety'}
dict3 = { 10:'ten', 11:'eleven', 12:'twelve', 13:'thirteen', 14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen', 18:'eighteen',19:'nineteen'}

def l(number):
    string = ''
    if len(number) == 3:
        string += dict1[int(number[0])] + 'hundred'
        if int(number[1]) == 1:
            string += 'and' + dict3[int(number)%100]
            return len(string)
        elif int(number[1]) == 0 and int(number[2]) == 0:
            return len(string)
        else:
            string += 'and' + dict2[int(number[1])] + dict1[int(number[2])]
            return len(string)
    elif len(number) == 2:
        if int(number[0]) == 1:
            string += dict3[int(number)]
            return len(string)
        else:
            string = string + dict2[int(number[0])] + dict1[int(number[1])]
            return len(string)
    else:
        string += dict1[int(number)]
        return len(string)
sum1 = 0
for i in range(1,1000):
    sum1 += l(str(i))

print(sum1+11)

#20.py

def fact(x):
    if  x == 1:
        return 1
    else:
        return x*fact(x-1)
sum = 0
for i in str(fact(100)):
    sum += int(i)

print(sum)

#21.py

def sum(i):
    sum1 = 0
    for j in range(1,i):
        if i%j == 0:
            sum1 += j
    if i != sum1:
        return sum1
    return 0


def amic():
    i = 10000
    while i > 1:
        if i == sum(sum(i)):
            yield i
        i -= 1

finalsum = 0
nums = []
for i in amic():
    nums.append(i)
    print(i,sum(i))
    finalsum += i

print(nums, finalsum)

#23.py

def abun_nums():
    i = 1
    while i < 28123:
        sum_div = 0
        for j in range(1,i):
            if i%j == 0:
                sum_div += j
        if sum_div > i:
            yield i
        else:
            yield 0
        i += 1

num_list = {i for i in range(1,28124)}
abun_num_list = []
for i in abun_nums():
    if i != 0:
        abun_num_list.append(i)
#print(abun_num_list)

for i in range(0,len(abun_num_list)):
    for j in range(i,len(abun_num_list)):
        if abun_num_list[i] + abun_num_list[j] in num_list:
            num_list.remove(abun_num_list[i]+abun_num_list[j])

#print(num_list)
sum = 0
for i in num_list:
    sum += i

print(sum)

#25.py

def prod(arr1,arr2):
    return [[arr1[0][0]*arr2[0][0]+arr1[0][1]*arr2[1][0],arr1[0][0]*arr2[0][1]+arr1[0][1]*arr2[1][1]],[arr1[1][0]*arr2[0][0]+arr1[1][1]*arr2[1][0],arr1[1][0]*arr2[0][1]+arr1[1][1]*arr2[1][1]]]

def power(n):
    M = [[1,1],[1,0]]
    if n == 0 or n == 1:
        return M
    elif n%2 == 1:
        return(prod(prod(power(n//2),power(n//2)),M))
    else:
        return(prod(power(n//2),power(n//2)))
i = 1
while True:
    i += 1
    if len(str(power(i)[0][0])) == 1000:
        print(i+1)
        break
    else:
        continue

#48.py

sum = 0
for i in range (1,1001):
    sum += i**i

print(sum%10**10)