列表

详情


NC15893. Dark♂游戏

描述

    某一天夜晚,宇宙中一个名为star星球的行星遭受到了万年难得一遇的全球大停电,据居民说,是黑暗之神搞的鬼!每次他的到来都能够让全球感到恐慌,因为一旦回答不出他的问题,将永远置身于黑暗之中,而且,黑暗之神为了刁难所有的居民,竟然明确告诉他们,他会给出多少个关卡,必须有一个人站出来挑战,只有完全通过了,这个星球才能够恢复正常。

    每一关黑暗之神都会给出一个数p,以及另一个数x,其中他将数p称为黑暗点,他要求,这个人必须要能够确定一个数值k,使得k个数值不断相加,最终的结果能够等于黑暗点。其中第i个数的数值为x^(k-i)。有趣的是,你可以自己指定每一个x^(k-i)的值是正数还是负数。假如这个人不能够找到满足条件的k时,那么他需要说出”impossible”。任何一个关卡的错误都会导致star星球永远陷入黑暗。但是他觉得自己不够聪明,所以想寻求聪明的地球人的帮助,是的,他看上了你,你能够帮他逃出黑暗吗?

输入描述

首先输入一个T,代表有T个关卡
其次对于每一个关卡都有两个整数p和x。 (T<=100 , 0<p<1e15 , 0<x<100)

输出描述

对于任意一关,你都需要输出一个整数k。
如果无法找到k满足黑暗之神,那么请输出”impossible”
对于每一个k,你都需要输出k个符号,代表第i个数是正数还是负数,如果是正数,则输出’+’符号,反之输出’-’符号。如果存在多组答案,则输出符号最少的那一组。

示例1

输入:

2
5 3
3 3

输出:

3
+--
impossible

说明:

3^2-3^1-3^0=5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 571ms, 内存消耗: 12496K, 提交时间: 2019-02-03 15:24:16

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int T, x, k;
ll p;
int fuckkkk[100];
int CNMBDSHABITI(ll p, int k) {
  if (k == 1) {
    if (p == 1) fuckkkk[k] = 1;
    else if (p == -1) fuckkkk[k] = -1;
    else return 0;
    return 1;
  }
  ll t = 1;
  for (int i = 0; i < k - 1; ++i) t *= x;
  if (p >= 0) {
    fuckkkk[k] = 1;
    return CNMBDSHABITI(p - t, k - 1);
  } else {
    fuckkkk[k] = -1;
    return CNMBDSHABITI(p + t, k - 1);
  }
}
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%lld%d", &p, &x);
    if (x == 1) {
      printf("%d\n", p);
      for (int i = 0; i < p; ++i) printf("+");
      printf("\n");
      continue;
    }
    k = 0;
    ll t = 0, m = 1;
    while (t < p) {k++;t += m;m *= x;}
    memset(fuckkkk, 0, sizeof fuckkkk);
    if (CNMBDSHABITI(p, k)) {
      printf("%d\n", k);
      for (int i = k; i; --i) printf("%c", fuckkkk[i] > 0 ? '+' : '-');
      printf("\n");
    }
    else printf("impossible\n");
  }
  return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 240ms, 内存消耗: 12464K, 提交时间: 2018-05-13 16:38:08

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <string>
using namespace std;

typedef long long ll;
char s[64], *sp;

bool calc_(ll p, ll x, ll mul) {
  sp = s;
  while(mul /= x)
    if(p > 0)
      *sp++ = '+', p -= mul;
    else
      *sp++ = '-', p += mul;
  *sp = '\0';
  return p == 0;
}

int main() {
  int t;
  scanf("%d", &t);
  while(t--) {
    ll p, x;
    scanf("%lld%lld", &p, &x);

    if(x == 1) {
      printf("%lld\n", p);
      for(int i = p; i--; )
        putchar('+');
      putchar('\n');
      continue;
    }

    ll mul = 1;
    while((mul *= x) <= p);
    if(calc_(p - mul / x, x, mul / x) || calc_(p - mul, x, mul))
      printf("%d\n+%s\n", (int)(sp - s + 1), s);
    else
      puts("impossible");
  }
  return 0;
}

上一题