11101: 【原1101】SuperXOR

题目描述

author: Jiejun Zhang 原OJ链接：https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1101

Description

Pangzi recently realized that bitwise XOR operation is just an addition without carries. For example, when computing (1001)_2 XOR (1101)_2, you write down:

``````  1001
+ 1101
-------
0100
``````

You see, everything is like an addition, except that there are no carries.

After realizing this, Pangzi invented Super XOR. It is just an addition on decimal numbers without carries. For example, 123 SUPERXOR 789 = 802, since 1+7=8, 2+8=0, 3+9=2.

Now comes a question. Given N, find 1 SUPERXOR 2 SUPERXOR 3 SUPERXOR 4 SUPERXOR ... SUPERXOR N

Input Format

The first line contains an integer T (1 <= T <= 1000), indicating the number of test cases.

T lines follow each containing 1 integers N (1 <= N <= 10^12).

Output Format

Output T lines, each line is an integer: the answer for the corresponding test case.

Sample Input

``````5
1
2
3
4
120001
``````

Sample Output

``````1
3
6
0
240001
``````

Case Limits

Time limit: 500 msec

Memory limit: 64 MB

LuminousXLB's solution

``````// 1101. SuperXOR
// #554592 正确 / 分数：100 / 时间：80ms / 内存：1080kb
#include <iostream>
using namespace std;

int main(int argc, char const* argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif

int T;
cin >> T;

for (int t = 0; t < T; ++t) {
unsigned long long num;
cin >> num;

unsigned long long threshold = 0;
unsigned long long tmp = num / 100;
if (tmp > 0) {
threshold = (tmp - 1) * 100 + 99;
} else {
threshold = 0;
}

int cnt[16][10] = { 0 };
for (unsigned long long k = num; k > threshold; k--) {
unsigned long long tmp = k;
for (short i = 0; tmp > 0; tmp /= 10, i++) {
cnt[i][tmp % 10]++;
}
}

short res[16] = { 0 };
for (int j = 0; j < 16; j++) {
for (int i = 0; i < 10; i++) {
res[j] += i * (cnt[j][i] % 10);
}
}

unsigned long long sum = 0;
for (short i = 15; i >= 0; i--) {
sum = sum * 10 + (res[i] % 10);
}

cout << sum << endl;
}
return 0;
}
``````