• Codeforces Round #462 (Div. 2) D. A Determined Cleanup


    D. A Determined Cleanup

    time limit per test1 second
    memory limit per test256 megabytes

    Problem 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 (1 ≤ p ≤ 1018, 2 ≤ k ≤ 2 000).

    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, …, ad - 1, describing a polynomial fulfilling the given requirements. Your output should satisfy 0 ≤ ai < k for all 0 ≤ i ≤ d - 1, and ad - 1 ≠ 0.

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

    Examples

    input
    46 2
    output
    7
    0 1 0 0 1 1 1
    input
    2018 214
    output
    3
    92 205 1

    Note

    In the first example, f(x) = x6 + x5 + x4 + x = (x5 - x4 + 3x3 - 6x2 + 12x - 23)·(x + 2) + 46.

    In the second example, f(x) = x2 + 205x + 92 = (x - 9)·(x + 214) + 2018.


    解题心得:

    1. 题目真的很难读懂,但是读懂之后比c题还简单一些。就是要你得出的多项式中的每一项系数不能为负数,也必须小于k。然后打印出每一项的系数就行了。
    2. 就是一个找规律的题目没啥好说的,很容易看出规律。还有就是要注意一下正负交替的问题以及数据范围。

    #include <bits/stdc++.h>
    using namespace std;
    vector <long long> ve;
    long long n,k;
    
    long long get_new_n(long long ans,bool flag){
        long long c = ans/k,temp;
        if(flag) {
            if(c*k-n != 0)
                c++;
            temp = c*k - ans;
        }
        else {
            temp = ans - c*k;
        }
        ve.push_back(temp);
        return c;
    }
    
    int main(){
        scanf("%lld%lld",&n,&k);
        bool flag = true;
        while(1){
            flag = !flag;
            n = get_new_n(n,flag);
            if(n == 0)
                break;
        }
        printf("%d
    ",ve.size());
        for(int i=0;i<ve.size();i++)
            printf("%lld ",ve[i]);
        return 0;
    }
  • 相关阅读:
    .net微信公众号开发——群发消息
    .net微信公众号开发——消息与事件
    .net微信公众号开发——基础接口
    .net微信公众号开发——快速入门
    如何实现ASP.NET中网站访问量的统计
    Asp.Net MVC3.0网站统计登录认证的在线人数
    SQL server 2008数据库的备份与还原(转)
    python创建多层目录的方式
    30款基本UX工具
    B树、B-树、B+树、B*树都是什么(转)
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107171.html
Copyright © 2020-2023  润新知