CF 934D 数学 推导多项式展开

给定两个数 p,k,求出一个多项式 f(x) 满足系数均小于 k 且为非负整数,且 f(x)=q(x)(x+k)+pq(x) 也为一个多项式。

1p1018,2k2000


将多项式 q(x) 展开:

f(x)=(qnxn+..+q1x+q0)(x+k)+p
f(x)=(kqn+qn1)xn+..+(kq1+q0)x+(kq0+p)

将多项式 f(x) 展开:
anxn+...+a1x+a0==(kqn+qn1)xn+..+(kq1+q0)x+(kq0+p)

将系数一一对应:
an=kqn+qn1
...
a1=kq1+q0
a0=kq0+p

很显然了, 我们只需要从次数小的往大的枚举,每次我们知道 qi1 的值,只需要调节 qikqi+qi1 的值控制在 [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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值