小坏蛋_千千

I was caught in a heavy rain!

Codeforces 933 B. A Determined Cleanup(数学)

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 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)·(x+k)+p , where q(x) is a polynomial (not necessarily with integer coefficients).

 

Input

The only line of input contains two space-separated integers p and k (1p1018,2k2000) .

 

Output

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 a0,a1,...,ad1 , describing a polynomial f(x)=i=0d1ai·xi fulfilling the given requirements. Your output should satisfy 0ai<k for all 0id1 , and ad10 .

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,k ,我们需要找出一个多项式 q(x) ,使得 f(x)=q(x)·(x+k)+p 的各项系数严格小于 k 且不为负数,输出 f(x) 的各项系数。

 

思路

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

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

假设 q(x)=a1+a2·x+a3·x2++an·xn1 ,其中 ai 为某一整数

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

  • 常数项:k×a1+p
  • 一次项:k×a2+a1
  • 二次项:k×a3+a2

于是我们有了一个通项不等式:0k×an+an1<k ,其中 a0=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;
}
阅读更多
版权声明:------------------- 这是千千的个人网站哦! https://www.dreamwings.cn ------------------- https://blog.csdn.net/qq_28954601/article/details/79329922
个人分类: 简单数学
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭