user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<main>:
  endbr64
  push   %r15
  mov    $0xd353c5c4,%edi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  call   <sqrt@plt>
  mov    $0x543a5166,%edi
  mov    %eax,%ebp
  call   <sqrt@plt>
  cmp    %eax,%ebp
  jg     L6
  movabs $0xcccccccccccccccd,%r11
  mov    %eax,%r9d
  movslq %ebp,%rsi
  movabs $0x1999999999999998,%r8
  movabs $0xa3d70a3d70a3d70b,%r12
  movabs $0x6666666666666667,%rbx
  movabs $0x346dc5d63886594b,%r13
  movabs $0x431bde82d7b634db,%r14
  movabs $0x2540be400,%r15
  jmp    L72
  xchg   %ax,%ax
L100:
  add    $0x1,%ebp
  add    $0x1,%rsi
  cmp    %ebp,%r9d
  jl     L6
L72:
  mov    %rsi,%rcx
  imul   %rsi,%rcx
  mov    %rcx,%rax
  imul   %r11,%rax
  add    %r8,%rax
  ror    %rax
  cmp    %r8,%rax
  ja     L100
  mov    %rcx,%rax
  mov    %rcx,%r10
  imul   %r12
  sar    $0x3f,%r10
  lea    (%rdx,%rcx,1),%rdi
  sar    $0x6,%rdi
  sub    %r10,%rdi
  mov    %rdi,%rax
  imul   %rbx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  sar    $0x2,%rdx
  sub    %rax,%rdx
  lea    (%rdx,%rdx,4),%rax
  add    %rax,%rax
  sub    %rax,%rdi
  cmp    $0x9,%rdi
  jne    L100
  mov    %rcx,%rax
  imul   %r13
  sar    $0xb,%rdx
  sub    %r10,%rdx
  mov    %rdx,%rax
  mov    %rdx,%rdi
  imul   %rbx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  sar    $0x2,%rdx
  sub    %rax,%rdx
  lea    (%rdx,%rdx,4),%rax
  add    %rax,%rax
  sub    %rax,%rdi
  cmp    $0x8,%rdi
  jne    L100
  mov    %rcx,%rax
  imul   %r14
  sar    $0x12,%rdx
  mov    %rdx,%rdi
  sub    %r10,%rdi
  mov    %rdi,%rax
  imul   %rbx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  sar    $0x2,%rdx
  sub    %rax,%rdx
  lea    (%rdx,%rdx,4),%rax
  add    %rax,%rax
  sub    %rax,%rdi
  cmp    $0x7,%rdi
  jne    L100
  mov    %rcx,%rax
  mov    $0x5f5e100,%edi
  cqto
  idiv   %rdi
  mov    $0xa,%edi
  cqto
  idiv   %rdi
  cmp    $0x6,%rdx
  jne    L100
  mov    %rcx,%rax
  cqto
  idiv   %r15
  cqto
  idiv   %rdi
  cmp    $0x5,%rdx
  jne    L100
  movabs $0xe8d4a51000,%r10
  mov    %rcx,%rax
  cqto
  idiv   %r10
  cqto
  idiv   %rdi
  cmp    $0x4,%rdx
  jne    L100
  movabs $0x5af3107a4000,%r10
  mov    %rcx,%rax
  cqto
  idiv   %r10
  cqto
  idiv   %rdi
  cmp    $0x3,%rdx
  jne    L100
  movabs $0x2386f26fc10000,%r10
  mov    %rcx,%rax
  cqto
  idiv   %r10
  cqto
  idiv   %rdi
  cmp    $0x2,%rdx
  jne    L100
  movabs $0xf21f494c589c0000,%rax
  add    %rax,%rcx
  movabs $0xde0b6b3a763ffff,%rax
  cmp    %rax,%rcx
  ja     L100
  mov    %ebp,%esi
  lea    D1(%rip),%rdi
  call   <printf@plt>
L6:
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D1
type_guessed: string

tool: D1: %d


assistant: ```c
int main() {
  const int lower_bound = sqrt(1020304050607080900);
  const int upper_bound = sqrt(1929394959697989990);
  int i;
  for (i = lower_bound; i <= upper_bound; ++i) {
    if ((long long)i * i % 10 == 0 && (long long)i * i / 100 % 10 == 9 && (long long)i * i / 10000 % 10 == 8 && (long long)i * i / 1000000 % 10 == 7 && (long long)i * i / 100000000 % 10 == 6 && (long long)i * i / 10000000000 % 10 == 5 && (long long)i * i / 1000000000000 % 10 == 4 && (long long)i * i / 100000000000000 % 10 == 3 && (long long)i * i / 10000000000000000 % 10 == 2 && (long long)i * i / 1000000000000000000 % 10 == 1) {
      printf("%d\n", i);
      break;
    }
  }
  return 0;
}
```