ferinの競プロ帳

競プロについてのメモ

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

問題ページ
Problem - D - Codeforces

考えたこと

  • ax2+bx+c を x+k で割るみたいなので何個か実験すると何か規則がありそう
  • コンテスト中はこの計算をミスってて別の規則を生み出してた(は?)
  • 終わったあとに冷静になって計算すると a_1 + a_2x + a_3x^2 + … + a_nx^n-1みたいなのを x+k で割ると余りは a_1(-k)^n + a_2(-k)^n-1 + … + a_n みたいな感じになる
  • 基底を-kと見ると-k進法みたいになる
  • pを-k進法に直せばいい
  • 10進法から2進法に直すときみたいに剰余を取って割るを繰り返す
  • (負) % mod は負なので剰余を取った結果マイナスになることがあるので正の値に直す
  • i桁目の値を+kすると (-k)^(i+1) 値が減るので次の桁を1増やす
  • O(logp)で10進法から-k進法に変換できるので投げると通る
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
  out<<'('<<a.first<<','<<a.second<<')';
  return out;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
  out<<'[';
  REP(i, a.size()) {out<<a[i];if(i!=a.size()-1)out<<',';}
  out<<']';
  return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

int ans[100010];
signed main(void)
{
  ll p;
  int k;
  cin >> p >> k;

  int idx = 0;
  while(p != 0) {
    ans[idx]=p%(-k), p /= -k;
    if(ans[idx] < 0) ans[idx] += k, p++;
    idx++;
  }

  cout << idx << endl;
  REP(i, idx) {
    cout << ans[i] << " ";
  }

  return 0;
}