user: 下面的汇编指令对应的C源代码是什么:

```asm
<func>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x2c(%rbp)
  mov    %r8d,-0x30(%rbp)
  mov    %r9d,-0x34(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jne    L110
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    0x18(%rbp),%eax
  cltq
  imul   %rdx,%rax
  add    %rax,0x20(%rbp)
  mov    -0x30(%rbp),%ecx
  mov    0x20(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <mark@plt>
  jmp    L47
L110:
  mov    0x10(%rbp),%eax
  cmp    0x18(%rbp),%eax
  jne    L103
  movl   $0x1,-0x8(%rbp)
  jmp    L13
L32:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%r9
  mov    0x18(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%edi
  mov    -0x2c(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0x34(%rbp),%r11d
  mov    -0x30(%rbp),%r10d
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    0x28(%rbp),%r8d
  push   %r8
  push   %r9
  push   %rdi
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    %r11d,%r9d
  mov    %r10d,%r8d
  mov    %rax,%rdi
  call   <func>
  add    $0x20,%rsp
  addl   $0x1,-0x8(%rbp)
L13:
  mov    -0x8(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jle    L32
  nop
L41:
  addl   $0x1,0x28(%rbp)
  mov    0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L41
  mov    0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rcx
  mov    0x10(%rbp),%eax
  sub    $0x1,%eax
  cltq
  imul   %rax,%rcx
  addl   $0x1,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  sub    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x34(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x2c(%rbp)
  jge    L47
  mov    -0x34(%rbp),%r9d
  mov    -0x30(%rbp),%r8d
  mov    -0x2c(%rbp),%ecx
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    0x28(%rbp),%edi
  push   %rdi
  push   $0x0
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    %rax,%rdi
  call   <func>
  add    $0x20,%rsp
  jmp    L47
L103:
  cmpl   $0x0,0x18(%rbp)
  jne    L55
  mov    -0x30(%rbp),%ecx
  mov    0x20(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <mark@plt>
  jmp    L47
L55:
  movl   $0x0,-0x4(%rbp)
  jmp    L5
L101:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%r9
  mov    0x18(%rbp),%eax
  sub    -0x4(%rbp),%eax
  mov    %eax,%edi
  mov    -0x2c(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0x34(%rbp),%r11d
  mov    -0x30(%rbp),%r10d
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    0x28(%rbp),%r8d
  push   %r8
  push   %r9
  push   %rdi
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    %r11d,%r9d
  mov    %r10d,%r8d
  mov    %rax,%rdi
  call   <func>
  add    $0x20,%rsp
  addl   $0x1,-0x4(%rbp)
L5:
  mov    -0x4(%rbp),%eax
  cmp    0x18(%rbp),%eax
  jle    L101
L47:
  nop
  leave
  ret
```

assistant: ```c
void func(unsigned long long *a, unsigned char *flag, unsigned long long *output, int io, int total, int N, int K, int k, unsigned long long sum, int last) {
  if (0 == io) {
    sum += output[io] * k;
    mark(a, flag, sum, total);
  } else {
    if (K == k) {
      for (int i = 1; i <= K; i++) {
        func(a, flag, output, io - 1, total, N, K, k - i, sum + output[io] * i, last);
      }
      while (flag[++last]) {
      }
      output[++io] = a[last] - output[0] * (K - 1);
      if (io < N - 1) {
        func(a, flag, output, io, total, N, K, K, 0, last);
      }
    } else {
      if (0 == k) {
        mark(a, flag, sum, total);
      } else {
        for (int i = 0; i <= k; i++) {
          func(a, flag, output, io - 1, total, N, K, k - i, sum + output[io] * i, last);
        }
      }
    }
  }
}
```