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; }
相关文章推荐
- Codeforces 615D Multipliers 【组合数学】
- Codeforces - 834C. The Meaningless Game - 数学
- CodeForces 374 B.Inna and Nine(组合数学)
- CodeForces 478 B.Random Teams(组合数学)
- Codeforces 336D Vasily the Bear and Beautiful Strings 组合数学
- CodeForces 382B Number Busters(数论-数学推理)
- CodeForces 484B 数学 Maximum Value
- 【codeforces 680 C】【数学题+交互题】C. Bear and Prime 1【底数是[2,100]中的数,现在你最多询问20次,询问为这个数是不是底数的因数,最后判断这个数是不是素数】
- Codeforces 448D: Multiplication Table(二分+数学)
- codeforces 702D D. Road to Post Office(数学)
- Codeforces 711D Directed Roads - 组合数学
- Codeforces 57 C Array ——组合数学
- codeforces 834C The Meaningless Game(数学题)
- CodeForces 707C Pythagorean Triples(数学 构造)
- Codeforces 933 C. A Colourful Prospect (平面图,欧拉公式)
- 4000 CodeForces 810A Straight <<A>> 【数学】【模拟】
- CodeForces 48C D - The Race (Fraction,数学)
- codeforces 377B Modulo Sum(数学,dp)
- Codeforces--618A--Slime CombiningCrawling(数学)
- Codeforces 40E Number Table - 组合数学