您的位置:首页 > 其它

Codeforces 933 B. A Determined Cleanup(数学)

2018-02-16 11:23 267 查看

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

Input

The only line of input contains two space-separated integers pp and kk (1 ≤ p ≤ 1018,2 ≤ k ≤ 2 000)(1 ≤ p ≤ 1018,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 dd — the number of coefficients in the polynomial.

In the second line print dd space-separated integers a0, a1, ..., ad − 1a0, a1, ..., ad − 1 , describing a polynomial f(x)=∑d−1i=0ai⋅xif(x)=∑i=0d−1ai·xi fulfilling the given requirements. Your output should satisfy 0 ≤ ai < k0 ≤ ai < k for all 0 ≤ i ≤ d − 10 ≤ i ≤ d − 1 , and ad − 1 ≠ 0ad − 1 ≠ 0 .

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

Examples input

46 2


Examples output

7
0 1 0 0 1 1 1


题意

给定正整数 p,kp,k ,我们需要找出一个多项式 q(x)q(x) ,使得 f(x) = q(x)⋅(x + k) + pf(x) = q(x)·(x + k) + p 的各项系数严格小于 kk 且不为负数,输出 f(x)f(x) 的各项系数。

思路

仔细想想便可以知道,这样的解一定是存在的,所以没有输出 −1−1 的可能性

我们可以对原式化简一下: f(x)=x⋅q(x)+k⋅q(x)+pf(x)=x·q(x)+k·q(x)+p

假设 q(x)=a1+a2⋅x+a3⋅x2+⋯+an⋅xn−1q(x)=a1+a2·x+a3·x2+⋯+an·xn−1 ,其中 aiai 为某一整数

现在我们再来讨论 f(x)f(x) 各项的系数:

常数项:k×a1+pk×a1+p

一次项:k×a2+a1k×a2+a1

二次项:k×a3+a2k×a3+a2



于是我们有了一个通项不等式:0≤k×an+an−1<k0≤k×an+an−1<k ,其中 a0=pa0=p

从上到下一一解出每一项即可,注意要保证系数不为负数

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: