2178

#include <iostream>
#include <queue>

using namespace std;

class node {
public:
	node() {}

	node(int x, int y, int value)
	{
		this->visited = false;
		this->x = x;
		this->y = y;
		this->value = value;
	}

	bool visited = false;
	int x, y;
	int value;

	void Init(int x, int y, int value)
	{
		this->visited = false;
		this->x = x;
		this->y = y;
		this->value = value;
	}
};

int main(void) {
	int x, y;
	string a;
	queue<node> q;
	cin >> x;
	cin >> y;

	node** arr = new node*[x];

	for (int i = 0; i < x; i++) {
		arr[i] = new node[y];
	}

	for (int i = 0; i < x; i++) {
		cin >> a;
		for (int j = 0; j < y; j++) {
			arr[i][j].Init(i, j, (int)a[j] - (int)'0');
		}
	}

	q.push(arr[0][0]);
	arr[0][0].visited = true;

	int depth = 0;
	int curX, curY;

	while (!q.empty()) {
		int qSize = q.size();
		depth++;
		for (int i = 0; i < qSize; i++)
		{
			node cur = q.front();

			// 도착했을 경우
			if (cur.x == x - 1 && cur.y == y - 1)
			{
				cout << depth << endl;
				return 0;
			}

			q.pop();

			curX = cur.x;
			curY = cur.y + 1;
			if (curY < y && !(arr[curX][curY].visited) && arr[curX][curY].value != 0) {
				q.push(arr[curX][curY]);
				arr[curX][curY].visited = true;
			}

			curX = cur.x;
			curY = cur.y - 1;
			if (curY >= 0 && !(arr[curX][curY].visited) && arr[curX][curY].value != 0) {
				q.push(arr[curX][curY]);
				arr[curX][curY].visited = true;
			}

			curX = cur.x + 1;
			curY = cur.y;
			if (curX < x && !(arr[curX][curY].visited) && arr[curX][curY].value != 0) {
				q.push(arr[curX][curY]);
				arr[curX][curY].visited = true;
			}

			curX = cur.x - 1;
			curY = cur.y;
			if (curX >= 0 && !(arr[curX][curY].visited) && arr[curX][curY].value != 0) {
				q.push(arr[curX][curY]);
				arr[curX][curY].visited = true;
			}
		}
	}

	return 0;
}

2331

#include <iostream>
#include <vector>
#include <cmath>
#include <unordered_map>

using namespace std;

int nextNumber(int num, int p) {
    int sum = 0;
    while (num > 0) {
        sum += pow(num % 10, p);
        num /= 10;
    }
    return sum;
}

int main() {
    int A, P;
    cin >> A >> P;

    unordered_map<int, int> visited;
    vector<int> sequence;

    int current = A;
    while (visited[current] == 0) {
        visited[current] = sequence.size() + 1;
        sequence.push_back(current);
        current = nextNumber(current, P);
    }

    int loopStart = visited[current] - 1;
    cout << loopStart << endl;

    return 0;
}