给定两个数
p,k,求出一个多项式
f(x) 满足系数均小于
k 且为非负整数,且
f(x)=q(x)(x+k)+p,
q(x) 也为一个多项式。
将多项式 f(x) 展开:
将系数一一对应:
很显然了, 我们只需要从次数小的往大的枚举,每次我们知道 qi−1 的值,只需要调节 qi 将 kqi+qi−1 的值控制在 [0,k) 之间即可, qi 等于 0,则已经求出了该多项式 f(x)。
(1≤p≤1018,2≤k≤2000)
将多项式 q(x) 展开:
f(x)=(qnxn+..+q1x+q0)(x+k)+p
f(x)=(kqn+qn−1)xn+..+(kq1+q0)x+(kq0+p)
将多项式 f(x) 展开:
anxn+...+a1x+a0==(kqn+qn−1)xn+..+(kq1+q0)x+(kq0+p)
将系数一一对应:
an=kqn+qn−1
...
a1=kq1+q0
a0=kq0+p
很显然了, 我们只需要从次数小的往大的枚举,每次我们知道 qi−1 的值,只需要调节 qi 将 kqi+qi−1 的值控制在 [0,k) 之间即可, qi 等于 0,则已经求出了该多项式 f(x)。
复杂度 O(logpk)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
#define show(a) cout<<#a<<" = "<<a<<endl
#define show2(b,c) cout<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<endl
#define show3(a,b,c) cout<<#a<<" = "<<a<<" "<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<endl
#define show4(a,b,c,d) cout<<#a<<" = "<<a<<" "<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<" "<<#d<<" = "<<d<<endl
const int maxn = 1005;
#define LOCAL
#define R register
long long p;
int k, a[10000010];
long long q[10000010];
int main() {
scanf("%I64d %d", &p, &k); q[0] = p;
for(R int i = 1;; i++) {
if(q[i - 1] == 0) {
printf("%d\n", i - 1);
for(R int j = 1; j < i; j++) printf("%d ", a[j]); return 0;
}
R long long d = q[i - 1] / k;
R int u = q[i - 1] % k;
// show4(i, q[i-1] ,d, u);
if(u < 0) {
u += k;
d--;
}
// show4(i, q[i-1] ,d, u);
a[i] = u;
q[i] = -1ll * d;
}
}