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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号