Problem:
図書整理
数の表わし方には色々な種類があり、私たちが普段使っている 10 進数は一つの代表的なものでしかありません。コンピュータ関連の知識がある人には、2 進数、16 進数あたりはとても身近なものです。
N さんは司書資格を活かして司書の仕事に就きました。最初の仕事は図書整理です。この図書館では、一冊ごとに一貫して番号が与えられており、それに従って本を整理しています。
この図書館では本の番号をマイナス十進数で表すことになっています。
マイナス十進数は、
a
n
a
n−1
a
n−2
...
a
2
a
1
a
0
(各
a
i
は 0~9 の数字) と表記する方法であり、この数は次の数を表します。
a
n
×(−10)
n
+ a
n−1
×(−10)
n−1
+
...
+ a
2
×(−10)
2
+ a
1
×(−10)
1
+ a
0
×(−10)
0
たとえば、マイナス十進数の 2156 は、以下のとおり十進数の-1944 に対応しています。
2×(-10)
3
+ 1×(-10)
2
+ 5×(-10)
1
+ 6×(-10)
0
=
2×(-1000) + 1×(100) + 5×(-10) + 6×(1) =
-2000 + 100 - 50 + 6 = -1944
十進数の番号をマイナス十進数に直すのは大変なので、N さんは大変不自由な思いをしています。
本の番号を入力とし、 この番号のマイナス十進数表記を出力するプログラムを作成してください。
Input
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットとして、本の番号を表す整数
A
(-2
31
≤
A
< 2
31
) が１行に与えられます。
データセットの数は 1200 を超えません。
Output
入力データセットごとに、番号のマイナス十進数表記を１行に出力します。
Sample Input
9
10
-10
-1944
-305432133
0
Output for the Sample Input
9
190
10
2156
1715573947

Submitted solutions:

code_snippet: #include <bits/stdc++.h>

using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second

template<typename A, typename B> inline bool chmax(A &a, B b) { if (a<b) { a=b; return 1; } return 0; }
template<typename A, typename B> inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; }

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<int, pii> pip;

const ll INF = 1ll<<29;
const ll MOD = 1000000007;
const double EPS = 1e-9;

int main() {
	ll N;
	while (cin >> N, N) {
		ll b[14] = {};
		
		b[0] = 1;
		FOR(i, 1, 14) b[i] = b[i - 1] * -10;
		
		queue<pll> que[14];
		que[13].push(pll(N, 0));
		
		for (int i = 13; i > 0; i--) {
			while (!que[i].empty()) {
				pll now = que[i].front(); que[i].pop();
				
				ll dif = now.fi;
				
				REP(j, 10) {
					ll ndif = dif - b[i] * j;
					int nk = log10(abs(ndif)) + 1;
					
					if (i >= nk) que[i - 1].push(pll(ndif, now.se + abs(b[i]) * j));
 
				}
			}
		}
		
		ll ans = -1;
		while (!que[0].empty()) {
			pii now = que[0].front(); que[0].pop();
			if (now.fi >= 0) ans = now.se + now.fi;
		}
		
		
		cout << ans << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3332
final_rank: 5

code_snippet: #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<long long, long long>>v1, v2;
long long power[16], power2[16];
long long solve(long long F, int p) {
	long long sum = 0;
	for (int i = p; i < p + 6; i++)sum += power[i] * ((F / power2[i - p]) % 10);
	return sum;
}
int main() {
	power[0] = 1; for (int i = 1; i < 16; i++)power[i] = power[i - 1] * (-10);
	power2[0] = 1; for (int i = 1; i < 16; i++)power2[i] = power2[i - 1] * (+10);
	for (int i = 0; i < 10000; i++) { v1.push_back(make_pair(solve(i, 0), i)); }
	for (int i = -999999; i < 1000000; i++) { v2.push_back(make_pair(solve(i, 4), i)); }
	sort(v2.begin(), v2.end());
	while (true) {
		long long r; cin >> r; if (r == 0)break;
		for (int i = 0; i < 10000; i++) {
			long long pos1 = lower_bound(v2.begin(), v2.end(), make_pair((r - v1[i].first), 0LL)) - v2.begin();
			if (pos1 < v2.size() && v2[pos1].first == (r - v1[i].first)) { cout << i + v2[pos1].second * 10000 << endl; }
		}
	}
	return 0;
}
accuracy: 1
time_ms: 400
memory_kb: 35784
final_rank: 7

code_snippet: #include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
long long n;
int main() {
	vector<pair<long long, int> > vr;
	for (int i = 0; i < 1000000; i++) {
		string s = to_string(i);
		int sum = 0;
		for (int j = 0; j < s.size(); j++) sum = sum * -10 + (s[j] - 48);
		vr.push_back(make_pair(sum, i));
	}
	sort(vr.begin(), vr.end());
	vector<long long> vr2;
	for (pair<long long, int> i : vr) vr2.push_back(i.first);
	while (cin >> n, n) {
		for (int i = 0; ; i++) {
			long long sum = 0;
			string s = to_string(i);
			for (int j = 0; j < s.size(); j++) sum = sum * -10 + (s[j] - 48);
			sum *= 1000000;
			int ptr = lower_bound(vr2.begin(), vr2.end(), n - sum) - vr2.begin();
			if (ptr < vr2.size() && vr2[ptr] == n - sum) {
				cout << i * 1000000 + vr[ptr].second << endl;
				break;
			}
		}
	}
	return 0;
}
accuracy: 1
time_ms: 160
memory_kb: 34492
final_rank: 6

code_snippet: #include <bits/stdc++.h>
using namespace std;

#define for_(i,a,b) for(int i=(a);i<(b);++i)

typedef long long lint;

lint n, ans, lb[10], ub[10], ten[10], k;

bool isok(int cans) {
	int k = 0, nn = 0;
	
	while (cans > 0) {
		int x = cans % 10;
		nn += x * ten[k];
		cans /= 10;
		++k;
	}
	
	return n == nn;
}

bool rec(int x, int cans, int i) {
	if (i > k) {
		if (isok(cans)) {
			ans = cans;
			return 1;
		} else {
			return 0;
		}
	}
	
	int xx = x < 0 ? -x : x, ii = i;
	while (ii--) xx /= 10;
	int p = xx % 10;
	
	if (rec(x - ten[i] * p, cans + p * (i % 2 ? -ten[i] : ten[i]), i + 1)) return 1;
	if (rec(x - ten[i] * (10 - p), cans + (10 - p)  * (i % 2 ? -ten[i] : ten[i]), i + 1)) return 1;
	return 0;
}

int main() {
	lb[0] = 0; ub[0] = 9;
	lint mn = 0, mx = 9, add = -90;
	
	for_(i,1,10) {
		if (i % 2) {
			lb[i] = mn + add;
			ub[i] = mn - 1;
			mn = lb[i];
		} else {
			lb[i] = mx + 1;
			ub[i] = mx + add;
			mx = ub[i];
		}
		add *= -10;
	}
	
	ten[0] = 1;
	for_(i,1,10) ten[i] = ten[i-1] * -10;
	
	while (cin >> n, n) {
		k = 0;
		while (n < lb[k] || n > ub[k]) ++k;
		rec(n, 0, 0);
		cout << ans << endl;
	}
}
accuracy: 1
time_ms: 10
memory_kb: 1156
final_rank: 1

code_snippet: #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

int main()
{
	int n;
	while(cin >> n && n)
	{
		string s = "";

		while(n != 0)
		{
			int t = n;

			if(n < 0) t *= -1;
			t %= 10;

			if(n < 0) t = (10 - t)%10;

			stringstream ss;
			ss << t;
			s += ss.str();

			n = (n - t)  / -10;
		}

		reverse(s.begin(),s.end());
		cout << s << endl;

	}

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1220
final_rank: 4

code_snippet: #include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>
#include <iostream>

#define VARIABLE(x) cerr << #x << "=" << x << endl
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define REP(i,m,n) for (int i=m;i<(int)(n);i++)

const int INF = 10000000;
int dx[4]={1, 0, -1, 0}, dy[4]={0, 1, 0, -1};
using namespace std;
typedef long long  ll;
typedef pair<double, double> P;

/** Problem0233 : Book Arrangement **/
int main() {
	int n;
	while (cin>>n, n) {
		string ans;
		while (1) {
			int t = n%10;
			n/=-10;
			if (t>=0)
				ans+='0'+t;
			else {
				ans+='0'+(t+10);
				n++;
			}
			if (n==0)
				break;
		}
		reverse(ans.begin(), ans.end());
		cout << ans << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1192
final_rank: 2

code_snippet: #include<iostream>

using namespace std;

/*
  convert n(10-base) to res('base'-base)

  when you want to convert 150(10-base) into x(-2-base) call convert(150,2)
 */

string convert(long long n, int base){
  string res;
  if(n==0) return "0";
  long long a,b;
  int t=0;
  for(;n;t++){
    t=t&1;
    a=n/base;
    b=n-a*base;
    if(b<0&&t==0){
      b+=base; a-=1;
    }else if(t==1&&b>0){
      b-=base; a+=1;
    }
    if(b<0)b=-b;
    res=" "+res;
    res[0]=b+'0';
    n=a;
  }
  return res;
}

int main(){
  int n;
  while(cin >> n && n){
    cout << convert(n,10) << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1200
final_rank: 3