cf933 B. A Determined Cleanup(数学,负进制)

题意:

已知整数 \(p,k\),求多项式 \(f(x)\) 使得 \(f(x)=q(x)(x+k)+p\),且 \(f(x)\) 的系数 \(0\le a_i < k\) 。输出 \(a_i\)

\(a_i\) 需为整数,但 \(q(x)\) 的系数不必为整数。

\(1\le p \le 10^{18},2\le k \le 2000\)

思路:

\(q(x)=b_0 + b_1 x + b_2 x^2 + \cdots + b_{d-2}x^{d-2}\) 。则

\[a_0 = kb_0 + p \\ a_1 = kb_1 + b_0 \\ a_2 = kb_2 + b_1 \\ \vdots \\ a_{d-2} = kb_{d-2} + b_{d-3} \\ 以及 a_{d-1} = b_{d-2} \]

回代得到

\[p=\sum _{i=0}^{d-1} (-k)^i a_i \]

所以 \(\overline {a_{d-1}\cdots a_1a_0}\) 就是 \(p\)\(-k\) 进制表示。这是唯一的且 \(d=O(log(p))\)

#include <bits/stdc++.h>
using namespace std;
long long p;
int k, cnt, a[107];
int get()
{
    int x = p % k;
    if(x < 0) x += k;
    return x % k;
}
signed main()
{
    scanf("%lld%d", &p, &k);

    while(p)
    {
        a[++cnt] = get();
        p -= get();
        p /= (-k);
    }

    printf("%d\n", cnt);
    for(int i = 1; i <= cnt; i++)
        printf("%d ", a[i]);

    return 0;
}

posted @ 2022-01-06 00:11  Bellala  阅读(44)  评论(0)    收藏  举报