[codeforces934D]A Determined Cleanup
试题描述
In order to put away old things and welcome a fresh new year, a thorough cleaning of the house is a must.
Little Tommy finds an old polynomial and cleaned it up by taking it modulo another. But now he regrets doing this...
Given two integers (p) and (k), find a polynomial (f(x)) with non-negative integer coefficients strictly less than (k), whose remainder is (p) when divided by ((x + k)). That is, (f(x) = q(x) cdot (x + k) + p), where (q(x)) is a polynomial (not necessarily with integer coefficients).
给定两个整数 (p) 和 (k),构造一个满足下列条件的多项式 (f(x)):
- 每项系数严格小于 (k) 且非负;
- (f(x) = g(x) cdot (x+k) + p),其中 (g(x)) 是个多项式,系数没有任何要求。
输入
The only line of input contains two space-separated integers (p) and (k) ((1 le p le 10^{18}, 2 le k le 2 000)).
输出
If the polynomial does not exist, print a single integer (-1), or output two lines otherwise.
In the first line print a non-negative integer (d) — the number of coefficients in the polynomial.
In the second line print d space-separated integers (a_0, a_1, cdots , a_{d - 1}), describing a polynomial fulfilling the given requirements. Your output should satisfy (0 le a_i < k) for all (0 le i le d - 1), and (a_{d - 1} e 0).
If there are many possible solutions, print any of them.
输入示例1
46 2
输出示例1
7
0 1 0 0 1 1 1
输入示例2
2018 214
输出示例2
3
92 205 1
数据规模及约定
见“输入”
题解
我们假设 (f(x) = sum_{i=0}^d a_i x^i),然后做一下 (frac{f(x)}{(x+k)}) 的大除法,并将得到的 (g(x)) 的系数写出来(假设 (g(x) = sum_{i=0}^{d-1} b_i x^i)),会发现如下规律:
于是发现 ((a_0a_1a_2 cdots)_{-k}) 就是 (p) 的 (-k) 进制表示,上面的过程证明了它是 (p) 的 (-k) 进制表示是满足题目要求的必要条件;由于 (g(x)) 没有任何约束,即 (b_i) 可以是任意实数,充分性也显然。
负进制的转化也是同样的过程,只不过除法要做到严格的向下取整,而不是用 C++ 中默认的朝零取整。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)
#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)
#define LL long long
LL read() {
LL x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 65
int cnt, A[maxn];
int main() {
LL p = read(), k = read();
while(p) {
LL div = p / -k;
if(-k * div > p) div++;
A[cnt++] = p - (-k * div);
p = div;
}
printf("%d
", cnt);
rep(i, 0, cnt - 1) printf("%d%c", A[i], i < cnt - 1 ? ' ' : '
');
return 0;
}