1 条题解

  • 0
    @ 2025-8-24 21:39:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 一只书虫仔
    End.

    搬运于2025-08-24 21:39:37,当前版本为作者最后更新于2020-08-12 13:24:13,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    Description

    给定一个序列 aia_i 的通项公式

    a0=0,a1=1,a2i=ai,a2i+1=ai+ai+1a_0=0,a_1=1,a_{2i}=a_i,a_{2i+1}=a_i+a_{i+1}

    给定 nn,求 ana_n

    Solution

    又是高精

    这题可以进行转化,比如 a2ia_{2i}a2i+1a_{2i+1},可以转化为两个 aia_i 和一个 ai+1a_{i+1}

    aia_iai+1a_{i+1} 可以继续转化,我们就可以把 ana_n 转化为:

    an=l×a0+r×a1a_n=l \times a_0+r \times a_1

    我们可以让所有满足 nZ,n>1n \in \mathbb Z,n>1ana_n 转化为上面的式子,比如:

    • a2=a22=a1=0×a0+1×a1=1a_2=a_\frac{2}{2}=a_1=0 \times a_0+1 \times a_1=1
    • $a_3=a_\frac{2}{2}+a_{\frac{2}{2}+1}=a_1+a_2=a_1+a_1=0 \times a_0+2 \times a_1=2$
    • $a_4=a_\frac{4}{2}=a_2=a_1=0 \times a_0+1 \times a_1=1$

    所以我们只需要求出 llrr 即可,因为 a0=0,a1=1a_0=0,a_1=1,所以输出 rr 即可。

    Code 1

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main () {
    	long long t;
    	scanf("%lld", &t);
    	while (t--) {
    		long long n;
    		scanf("%lld", &n);
    		long long l = 1, r = 0;
    		while (n > 0) {
    			if (n % 2 == 0)
    				l = l + r;
    			else
    				r = l + r;
    			n /= 2;
    		}
    		printf("%lld\n", r);
    	}
    	return 0;
    }
    
    

    预计得分:5050
    Record Link

    让我们重新审视 nn 的数据范围,n10100n \le 10^{100}

    所以这题需要高精。

    Code 2

    t = int(input())
    
    for i in range(1, t + 1) :
        n = int(input())
        
        l = 1
        r = 0
    
        while n > 0 :
            if n % 2 == 0 :
                l = l + r
            else :
                r = l + r
            n //= 2
    
        print(r)
    

    预计得分:100100
    Record Link

    用 python 会被骂的,所以还是要好好写 C++ 比较好

    By Shuchong
    2020.8.12

    • 1

    信息

    ID
    1645
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者