#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ assert(int);
int largest_product_in_series(char *, int);
int main() {
  char number[] = "73167176531330624919225119674426574742355349194934"
                  "96983520312774506326239578318016984801869478851843"
                  "85861560789112949495459501737958331952853208805511"
                  "12540698747158523863050715693290963295227443043557"
                  "66896648950445244523161731856403098711121722383113"
                  "62229893423380308135336276614282806444486645238749"
                  "30358907296290491560440772390713810515859307960866"
                  "70172427121883998797908792274921901699720888093776"
                  "65727333001053367881220235421809751254540594752243"
                  "52584907711670556013604839586446706324415722155397"
                  "53697817977846174064955149290862569321978468622482"
                  "83972241375657056057490261407972968652414535100474"
                  "82166370484403199890008895243450658541227588666881"
                  "16427171479924442928230863465674813919123162824586"
                  "17866458359124566529476545682848912883142607690042"
                  "24219022671055626321111109370544217506941658960408"
                  "07198403850962455444362981230987879927244284909188"
                  "84580156166097919133875499200524063689912560717606"
                  "05886116467109405077541002256983155200055935729725"
                  "71636269561882670428252483600823257530420752963450";
  assert(5832 == largest_product_in_series(number, 4));
  assert(2571912 == largest_product_in_series(number, 7));
  assert(23514624000 == largest_product_in_series(number, 13));
  assert(282293061120 == largest_product_in_series(number, 15));
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x3f0,%rsp
movl   $0x0,-0x4(%rbp)
lea    -0x3f0(%rbp),%rdi
lea    0xeb0(%rip),%rsi
mov    $0x3e9,%edx
call   1050 <memcpy@plt>
lea    -0x3f0(%rbp),%rdi
mov    $0x4,%esi
call   1030 <largest_product_in_series@plt>
mov    %eax,%ecx
mov    $0x16c8,%eax
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
lea    -0x3f0(%rbp),%rdi
mov    $0x7,%esi
call   1030 <largest_product_in_series@plt>
mov    %eax,%ecx
mov    $0x273e88,%eax
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
lea    -0x3f0(%rbp),%rdi
mov    $0xd,%esi
call   1030 <largest_product_in_series@plt>
movslq %eax,%rcx
movabs $0x57994b000,%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
lea    -0x3f0(%rbp),%rdi
mov    $0xf,%esi
call   1030 <largest_product_in_series@plt>
movslq %eax,%rcx
movabs $0x41b9fa4600,%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
xor    %eax,%eax
add    $0x3f0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
sub    $0x3f0,%rsp
lea    0xec1(%rip),%rsi
mov    %rsp,%rbx
mov    $0x3e9,%edx
mov    %rbx,%rdi
call   1050 <memcpy@plt>
mov    %rbx,%rdi
mov    $0x4,%esi
call   1030 <largest_product_in_series@plt>
xor    %edi,%edi
cmp    $0x16c8,%eax
sete   %dil
call   1040 <assert@plt>
mov    %rbx,%rdi
mov    $0x7,%esi
call   1030 <largest_product_in_series@plt>
xor    %edi,%edi
cmp    $0x273e88,%eax
sete   %dil
call   1040 <assert@plt>
mov    %rbx,%rdi
mov    $0xd,%esi
call   1030 <largest_product_in_series@plt>
xor    %edi,%edi
call   1040 <assert@plt>
mov    %rbx,%rdi
mov    $0xf,%esi
call   1030 <largest_product_in_series@plt>
xor    %edi,%edi
call   1040 <assert@plt>
xor    %eax,%eax
add    $0x3f0,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@__const.main.number = [1001 x i8] c"7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca [1001 x i8]
store i32 0, i32* %1
%3 = bitcast [1001 x i8]* %2 to i8*
%4 = getelementptr inbounds [1001 x i8], [1001 x i8]* %2, i64 0, i64 0
%5 = call i32 @largest_product_in_series(i8* %4, i32 4)
%6 = icmp eq i32 5832, %5
%7 = zext i1 %6 to i32
%8 = call i32 @assert(i32 %7)
%9 = getelementptr inbounds [1001 x i8], [1001 x i8]* %2, i64 0, i64 0
%10 = call i32 @largest_product_in_series(i8* %9, i32 7)
%11 = icmp eq i32 2571912, %10
%12 = zext i1 %11 to i32
%13 = call i32 @assert(i32 %12)
%14 = getelementptr inbounds [1001 x i8], [1001 x i8]* %2, i64 0, i64 0
%15 = call i32 @largest_product_in_series(i8* %14, i32 13)
%16 = sext i32 %15 to i64
%17 = icmp eq i64 23514624000, %16
%18 = zext i1 %17 to i32
%19 = call i32 @assert(i32 %18)
%20 = getelementptr inbounds [1001 x i8], [1001 x i8]* %2, i64 0, i64 0
%21 = call i32 @largest_product_in_series(i8* %20, i32 15)
%22 = sext i32 %21 to i64
%23 = icmp eq i64 282293061120, %22
%24 = zext i1 %23 to i32
%25 = call i32 @assert(i32 %24)
ret i32 0
}

LLVM IR (-O2):
@__const.main.number = [1001 x i8] c"7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450\00"
define i32 @main() {
%1 = alloca [1001 x i8]
%2 = getelementptr inbounds [1001 x i8], [1001 x i8]* %1, i64 0, i64 0
%3 = call i32 @largest_product_in_series(i8* %2, i32 4)
%4 = icmp eq i32 %3, 5832
%5 = zext i1 %4 to i32
%6 = call i32 @assert(i32 %5)
%7 = call i32 @largest_product_in_series(i8* %2, i32 7)
%8 = icmp eq i32 %7, 2571912
%9 = zext i1 %8 to i32
%10 = call i32 @assert(i32 %9)
%11 = call i32 @largest_product_in_series(i8* %2, i32 13)
%12 = call i32 @assert(i32 0)
%13 = call i32 @largest_product_in_series(i8* %2, i32 15)
%14 = call i32 @assert(i32 0)
ret i32 0
}