Codeforces - 1166D - Cute Sequences

Codeforces - 1166D - Cute Sequences

地址

http://codeforces.com/contest/1166/problem/D

原文地址

https://www.lucien.ink/archives/433

題目

Given a positive integer mm, we say that a sequence x1,x2,,xnx_1, x_2, \dots, x_n of positive integers is mm-cute if for every index ii such that 2in2 \le i \le n it holds that xi=xi1+xi2++x1+rix_i = x_{i - 1} + x_{i - 2} + \dots + x_1 + r_i for some positive integer rir_i satisfying 1rim1 \le r_i \le m.

You will be given qq queries consisting of three positive integers aa, bb and mm. For each query you must determine whether or not there exists an mm-cute sequence whose first term is aa and whose last term is bb. If such a sequence exists, you must additionally find an example of it.

題意

定義 xi=xi1+xi2++x1+rix_i = x_{i - 1} + x_{i - 2} + \dots + x_1 + r_i1rim1 \le r_i \le m ,給你 a b m ,判斷是否存在一個一個序列 xx ,假定這個序列的長度爲 nn ,使得 x1=ax_1 = axn=bx_n = b

題解

規定 2x=02 ^ {x} = 0 (x<0)(x < 0) ,歸納一下,可以發現:(a)xn(n2)=2n2a+2n3r2+2n4r3++2rn2+rn1+rn x_{n(n \ge 2)} = 2 ^ {n - 2}a + 2 ^ {n - 3} r_2 + 2 ^ {n - 4} r_3 + \dots + 2r_{n - 2} + r_{n - 1} + r_n\ \tag{a}

即判斷是否存在一個 xnx_n 滿足 (a)(a) 式且 xn=bx_n = b

可以進一步簡寫一下,如果將 bb 代入 (a)(a) 式,且令:(b)r=2n3r2+2n4r3++2rn2+rn1+rnr = 2 ^ {n - 3} r_2 + 2 ^ {n - 4} r_3 + \dots + 2r_{n - 2} + r_{n - 1} + r_n \tag{b} 則有:b=2n2a+rb = 2 ^ {n - 2}a + r 可以發現忽略 (b)(b) 式中的 rnr_n 之後,剩下的式子爲 rr 爲一個二進制表示,我們可以將 (b)(b) 整體減去一個 kk 從而消掉 rnr_n ,這樣一來可以表示爲 xn=2n2(a+k)+rx_n = 2 ^ {n - 2}(a + k) + r ,令 rr 的二進制表示爲 dn3dn4d0d_{n - 3}d_{n - 4} \dots d_0 ,此時 ri(i<n)=k+dni1r_{i(i < n)} = k + d_{n - i - 1}rn=kr_n = k

然後暴力輸出 xx 序列即可。

代碼

https://pasteme.cn/8173

#include <bits/stdc++.h>
const int maxn = 54;
typedef long long ll;
ll __pow[maxn] = {1}, r[maxn], a, b, m;
int solve() {
    if (a == b) return 1;
    for (int n = 2; __pow[n - 2] <= b; n++) {
        ll div = b / __pow[n - 2], mod = b % __pow[n - 2];
        if (div > a && (div - a < m || (mod == 0 && div - a <= m)) && __pow[n - 2] - 1 >= mod) {
            for (int i = 2, bit = n - 3; bit >= 0; i++, bit--) r[i] = (mod >> bit & 1) + div - a;
            return n;
        }
    }
    return -1;
}
ll calc(int x, int n) {
    if (x > 1 && x < n) {
        ll ret = __pow[x - 2] * a;
        for (int i = 2; i < x; i++) ret = ret + __pow[x - i - 1] * r[i];
        return ret + r[x];
    } else return x == 1 ? a : b;
}
int main() {
    int q, n;
    for (int i = 1; i < maxn; i++) __pow[i] = __pow[i - 1] << 1;
    for (scanf("%d", &q); q; q--) {
        scanf("%lld%lld%lld", &a, &b, &m);
        if (~(n = solve())) {
            printf("%d ", n);
            for (int i = 1; i <= n; i++) printf("%lld%c", calc(i, n), i == n ? '\n' : ' ');
        } else puts("-1");
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章