user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x88(%rbp),%rax
  mov    %rax,%rsi
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  mov    -0x88(%rbp),%rax
  shr    %rax
  mov    %rax,-0x80(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,-0x78(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xcccccccccccccccd,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x2,%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x88(%rbp),%rcx
  movabs $0x2492492492492493,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rdx,%rax
  shr    $0x2,%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x2,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xcccccccccccccccd,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x3,%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x88(%rbp),%rax
  shr    %rax
  movabs $0x4924924924924925,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,-0x50(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0x8888888888888889,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x3,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x88(%rbp),%rcx
  movabs $0x8618618618618619,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rdx,%rax
  shr    $0x4,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xea0ea0ea0ea0ea0f,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x5,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0x8888888888888889,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x4,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x88(%rbp),%rax
  shr    %rax
  movabs $0xc30c30c30c30c30d,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x4,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0xea0ea0ea0ea0ea0f,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x6,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0x4e04e04e04e04e05,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x5,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x88(%rbp),%rax
  movabs $0x4e04e04e04e04e05,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x6,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x88(%rbp),%rax
  sub    -0x80(%rbp),%rax
  sub    -0x78(%rbp),%rax
  sub    -0x70(%rbp),%rax
  sub    -0x68(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  sub    -0x30(%rbp),%rax
  sub    -0x28(%rbp),%rax
  sub    -0x20(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L1
  call   <__stack_chk_fail@plt>
L1:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D14
type_infered: string
name: read_data
arguments: data_label: D6
type_infered: string

tool: D14: %lld

tool: D6: %llu


assistant: ```c
int main() {
  unsigned long long N;
  scanf("%lld", &N);
  unsigned long long X_2 = N / 2;
  unsigned long long X_3 = N / 3;
  unsigned long long X_5 = N / 5;
  unsigned long long X_7 = N / 7;
  unsigned long long X_2_3 = N / 6;
  unsigned long long X_2_5 = N / 10;
  unsigned long long X_2_7 = N / 14;
  unsigned long long X_3_5 = N / 15;
  unsigned long long X_3_7 = N / 21;
  unsigned long long X_5_7 = N / 35;
  unsigned long long X_2_3_5 = N / 30;
  unsigned long long X_2_3_7 = N / 42;
  unsigned long long X_2_5_7 = N / 70;
  unsigned long long X_3_5_7 = N / 105;
  unsigned long long X_2_3_5_7 = N / 210;
  printf("%llu\n", N - X_2 - X_3 - X_5 - X_7 + X_2_3 + X_2_5 + X_2_7 + X_3_5 + X_3_7 + X_5_7 - X_2_3_5 - X_2_3_7 - X_2_5_7 - X_3_5_7 + X_2_3_5_7);
  return 0;
}
```