1 条题解

  • 0
    @ 2025-8-24 22:57:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar spfa_
    这个什么很懒,家伙也没有留下

    搬运于2025-08-24 22:57:36,当前版本为作者最后更新于2024-05-07 17:13:56,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    才爆了五个标,太弱了

    认真分析语句的性质,得到:

    • nn 只增不减,所以要计算的是增量

    • pp 只减不增

    • 跳转语句等价于 do-while,所以 if 语句本质上是实现不了的

    那么如何实现任意次数次的循环呢?我们可以将一个变量变为想要次数的相反数,然后另外一个置 00,如何变量不等则一直减 11,就能实现循环了。对于多重循环只需嵌套一下即可。

    那么通过循环就能实现一些简单的加,乘操作了。

    task 1

    2n=n+n2n=n+n,循环 nn 次加一即可。

    3
    dec 1
    new 2
    ifneq 1 3 goto 1
    

    task 2

    (n2)=1+2++n1=n+(2++n2){n\choose 2}=1+2+\dots+n-1=n+(2+\dots+n-2),从 22 循环到 n2n-2 即可。

    9
    dec 1
    dec 1
    dec 1
    assign 2 1
    dec 2
    new 3
    iftry 2 goto 5
    dec 1
    ifneq 1 4 goto 4
    

    task 3

    600=n+(600n)600=n+(600-n),很直接的想法是构造出 600n600-n 次循环,变成相反数变成 n600n-600600600 可以视为 24×2524\times 25,循环即可。

    35
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    assign 3 2
    dec 3
    dec 4
    assign 5 6
    dec 5
    dec 1
    ifneq 5 3 goto 29
    ifneq 4 2 goto 27
    dec 6
    new 8
    ifneq 1 6 goto 33
    

    task 4

    直接加一即可。

    1
    new 1
    

    task 5

    n21=(n+1)(n1)=n+(n+1)(n2)+1n^2-1=(n+1)(n-1)=n+(n+1)(n-2)+1

    10
    assign 2 1
    dec 2
    dec 2
    new 4
    dec 1
    assign 3 2
    dec 3
    new 4
    ifneq 3 5 goto 7
    iftry 1 goto 5
    

    task 6

    n+2000=n+2×10×10×10n+2000=n+2\times10\times10\times10

    24
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 2
    dec 3
    dec 3
    dec 4
    assign 5 8
    dec 5
    assign 6 8
    dec 6
    assign 7 8
    dec 7
    new 9
    ifneq 7 2 goto 19
    ifneq 6 2 goto 17
    ifneq 5 2 goto 15
    ifneq 3 4 goto 13
    

    task 7

    考虑倍增。将 p1p_1 一直减去 22 的幂次,若大于等于 00 则倍增,次数加一。

    13
    assign 2 1
    dec 3
    dec 3
    dec 2
    dec 2
    new 7
    assign 4 3
    assign 5 6
    dec 5
    dec 3
    dec 2
    ifneq 5 4 goto 9
    iftry 2 goto 6
    

    task 8

    考虑将 nn 一直减 22 直到 n<0n<0,那么 nn 只会为 1,2-1, -2 其中一种。而我们需要做的是将 1-1 的情况加 112-2 的情况加 22。用一个初始为 1-1 的变量,减 11 并判断是否相等,相等再执行一遍加 11 操作。

    6
    dec 1
    dec 1
    iftry 1 goto 1
    dec 2
    new 3
    ifeq 1 2 goto 4
    

    task 9

    gcd(n,n4)=gcd(4,n4)=gcd(nmod4,4)\gcd(n,n-4)=\gcd(4,n-4)=\gcd(n\bmod4,4)

    类似 task 8 的方法我们可以对 nn 一直减 44,但是这里的处理方法有点不同。这里我将 4-4 的情况变为 00 的情况,然后有 0,1,2,30,-1,-2,-3 的情况,需要增加的数分别为 5,2,3,25,2,3,2。对于任意数先 new 两次,然后减 22。如果等于 4-4 则跳回第二个 new,如果等于 2-2 跳回第一个 new

    18
    dec 1
    dec 1
    dec 1
    dec 1
    assign 2 1
    dec 2
    iftry 2 goto 1
    dec 3
    dec 3
    assign 4 3
    dec 4
    dec 4
    new 5
    new 5
    dec 1
    dec 1
    ifeq 1 4 goto 14
    ifeq 1 3 goto 13
    

    task 10

    这里我用了点奇淫技巧。思路是尽可能的构造一个一次函数,使得满足条件。然后玩弄半天后发现 y=4.3xy=4.3x 最佳,似乎没有更好的了。下面是函数图像:

    然后如何凑出 4.3n4.3n 呢?4n4n 部分好搞,而 0.3n0.3n 部分则可以看成 n3\dfrac{n}{3},这个只需长度为 nn,步长为 33 的循环即可,那么就解决了。

    11
    assign 2 1
    dec 1
    new 4
    new 4
    new 4
    ifneq 1 3 goto 2
    dec 2
    dec 2
    dec 2
    new 4
    iftry 2 goto 7
    
    • 1

    信息

    ID
    9764
    时间
    3000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者