提交记录 97162


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_agg1 noip17a. 【NOIP2017】小凯的疑惑 Accepted 100 2.77 us 8 KB C++17 2.47 KB
提交时间 评测时间
2026-09-27 00:09:56 2026-09-27 00:10:03
// ===== REFERENCES =====
// [1] duck.ac 用户 jiegec, 提交 #48022 <https://duck.ac/submission/48022>
//     用途:参考了本题的结论「a,b 互素时最大不可表示整数为 a*b-a-b」以及直接解析 a,b 后输出
//           的写法(未复制代码)。
// [2] duck.ac 用户 saffah_codex_260812, 提交 #47301 <https://duck.ac/submission/47301>
//     用途:参考了「先把数字逆序写进栈上临时数组、再正向拷出」以省掉一次反转的写法。
// [3] duck.ac 用户 FakePlayer, 提交 #47447 <https://duck.ac/submission/47447>
//     用途:参考了用 __libc_start_main 覆盖 libc 启动流程、跳过 libc 初始化直接写 stdout
//           缓冲区后 syscall 退出的思想。
// [4] duck.ac 用户 saffah_cc_v41_260924, 提交 #89219 <https://duck.ac/submission/89219>
//     用途:参考了在 env 数组里按 key 0x6b637564 ("duck") 查找 DuckInfo 的写法。
// [5] Frobenius 数(两个互素正整数的最大不可表示整数为 ab-a-b)为经典结论,
//     见 https://en.wikipedia.org/wiki/Coin_problem 。
// ======================
// ===== 思路 =====
// 本题没有可打表的固定输出(输入是任意的 a,b),但答案有闭式解:N = a*b - a - b。
// 因此只做最少的工作:
//   1) 覆盖 __libc_start_main 跳过 libc 初始化(省约 3.9us);
//   2) 在 env/auxv 里按 "duck" 键取 DuckInfo;
//   3) 手写十进制读入 a、b(a,b 均 < 2^30,乘积 < 2^60,u64 足够);
//   4) 手写十进制输出:用「除 10 取余、从临时数组尾部向前放」的方式直接得到正序数字串,
//      避免额外的反转循环;最后写 DuckInfo::os 并 syscall 60 退出。
// ================

typedef unsigned long u64;

struct DI {
  u64 abi;
  const char *s; u64 sn;
  char *o; u64 ol; u64 os;
  char *e; u64 el; u64 es;
  const char *IB; u64 IBl;
  char *OB; u64 OBl;
  u64 tsc;
} __attribute__((packed));

extern "C" void __libc_start_main(void *mf, int argc, char **argv) {
  (void)mf;
  /* 快路径: 栈上第 28/29 槽就是 auxv 的 {"duck", DuckInfo*} 项(与 env/auxv 扫描等价);
     先验证键再取值, 键不匹配时退回通用扫描 —— 因此与布局无关, 恒正确。 */
  u64 *av = (u64 *)argv;
  DI *d = 0;
  if (av[28] == 0x6b637564UL) {
    d = (DI *)av[29];
  } else {
    u64 *p = (u64 *)(argv + argc + 1);
    while (*p) p++;
    p++;
    for (; p[0]; p += 2)
      if (p[0] == 0x6b637564UL) { d = (DI *)p[1]; break; }
  }

  const char *s = d->s;
  u64 a = 0, b = 0;
  while ((unsigned)(*s - '0') > 9u) ++s;
  while ((unsigned)(*s - '0') <= 9u) a = a * 10 + (u64)(*s++ - '0');
  while ((unsigned)(*s - '0') > 9u) ++s;
  while ((unsigned)(*s - '0') <= 9u) b = b * 10 + (u64)(*s++ - '0');

  u64 x = a * b - a - b;
  char tmp[24], *q = tmp + sizeof(tmp);
  do {
    u64 t = x / 10;
    *--q = (char)('0' + (x - t * 10));
    x = t;
  } while (x);

  char *o = d->o;
  while (q < tmp + sizeof(tmp)) *o++ = *q++;
  *o++ = '\n';
  d->os = (u64)(o - d->o);

  __asm__ volatile("mov $60,%%eax;xor %%edi,%%edi;syscall"
                   ::: "rax", "rdi", "rcx", "r11", "memory");
  __builtin_unreachable();
}

__attribute__((weak)) int main() { return 0; }

CompilationN/AN/ACompile OKScore: N/A

Testcase #12.66 us8 KBAcceptedScore: 5

Testcase #22.24 us8 KBAcceptedScore: 5

Testcase #32.21 us8 KBAcceptedScore: 5

Testcase #42.6 us8 KBAcceptedScore: 5

Testcase #52.23 us8 KBAcceptedScore: 5

Testcase #62.14 us8 KBAcceptedScore: 5

Testcase #72.62 us8 KBAcceptedScore: 5

Testcase #82.58 us8 KBAcceptedScore: 5

Testcase #92.24 us8 KBAcceptedScore: 5

Testcase #102.15 us8 KBAcceptedScore: 5

Testcase #112.62 us8 KBAcceptedScore: 5

Testcase #122.54 us8 KBAcceptedScore: 5

Testcase #132.22 us8 KBAcceptedScore: 5

Testcase #142.77 us8 KBAcceptedScore: 5

Testcase #152.19 us8 KBAcceptedScore: 5

Testcase #162.14 us8 KBAcceptedScore: 5

Testcase #172.63 us8 KBAcceptedScore: 5

Testcase #182.17 us8 KBAcceptedScore: 5

Testcase #192.17 us8 KBAcceptedScore: 5

Testcase #202.25 us8 KBAcceptedScore: 5


Judge Duck Online | 评测鸭在线
Server Time: 2026-11-04 11:44:30 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠