# Codeforces 933 B. A Determined Cleanup（数学）

152人阅读 评论(0)

## Description

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$$p$ and $k$$k$ , find a polynomial $f\left(x\right)$$f(x)$ with non-negative integer coefficients strictly less than $k$$k$ , whose remainder is $p$$p$ when divided by $\left(x + k\right)$$(x + k)$ . That is, $f\left(x\right) = q\left(x\right)·\left(x + k\right) + p$$f(x) = q(x)·(x + k) + p$ , where $q\left(x\right)$$q(x)$ is a polynomial (not necessarily with integer coefficients).

## Input

The only line of input contains two space-separated integers $p$$p$ and $k$$k$ $\left(1 \le p \le {10}^{18},2 \le k \le 2 000\right)$$(1 ≤ p ≤ 10^{18}, 2 ≤ k ≤ 2 000)$ .

## Output

If the polynomial does not exist, print a single integer $-1$$-1$ , or output two lines otherwise.

In the first line print a non-negative integer $d$$d$ — the number of coefficients in the polynomial.

In the second line print $d$$d$ space-separated integers ${a}_{0}, {a}_{1}, ..., {a}_{d - 1}$$a_0, a_1, ..., a_{d - 1}$ , describing a polynomial $f\left(x\right)=\sum _{i=0}^{d-1}{a}_{i}·{x}^{i}$$f(x)=\sum_{i=0}^{d-1}a_i·x^i$ fulfilling the given requirements. Your output should satisfy $0 \le {a}_{i} < k$$0 ≤ a_i < k$ for all $0 \le i \le d - 1$$0 ≤ i ≤ d - 1$ , and ${a}_{d - 1} \ne 0$$a_{d - 1} ≠ 0$ .

If there are many possible solutions, print any of them.

46 2

7
0 1 0 0 1 1 1

## 思路

• 常数项：$k×{a}_{1}+p$$k \times a_1+p$
• 一次项：$k×{a}_{2}+{a}_{1}$$k \times a_2 + a_1$
• 二次项：$k×{a}_{3}+{a}_{2}$$k\times a_3+a_2$

## AC 代码

#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0);
using namespace std;
typedef __int64 LL;
const int maxn = 1e5+10;

LL a[maxn];
LL ans[maxn];
LL k,p;

LL get(LL a1,int i)
{
ans[i] = ((a1 % k) + k) % k;
return (ans[i] - a1)/k;
}

int main()
{
IO;
cin>>p>>k;
a[0] = p;
for(int i=1; i<maxn; i++)
{
a[i] = get(a[i-1],i);
if(!a[i])
{
cout<<i<<endl;
for(int j=1; j<=i; j++)
cout<<ans[j]<<" ";
cout<<endl;
break;
}
}
return 0;
}

个人资料
等级：
访问量： 36万+
积分： 1万+
排名： 2019
欢迎关注 <千与梦随> 哦！
博客专栏
 那些年,我们一起追过的算法 文章：6篇 阅读：23920
最新评论