pku2868.cpp

来自「这是ACM 方面的资料 是PKU的 北京大学的出来的」· C++ 代码 · 共 82 行

CPP
82
字号
#include <stdio.h>

int calc(int N, int p)
{
	int tmp, i, j, len, pown, s, t;
	len = 1;
	tmp = p - 1;
	int stack[100];
	
	if (N >= p)
	{
		return p - 1;
	}

	pown = 1;
	t = 1;
	while (tmp / (t * N) >= pown)
	{
		tmp -= pown * t * N;
		t++;
		pown *= N;
		len++;
	}
	tmp = p;
	pown = N;
	for (i = 1; i < len; i++)
	{
		tmp -= pown * i;
		pown *= N;
	}

	if (tmp % (N * len) == 0)
	{
		return N - 1;
	}

	s = (tmp + len - 1) % len + 1;
	tmp = (tmp - 1) / len;
	
	for (i = len; i > s; i--)
	{
		tmp /= N;
	}
	return tmp% N;
}

int main()
{
	int i, j, p;
	int N, Q;
	char name[27][110];
	
	while (scanf("%d %d", &N, &Q) != -1)
	{
		if (N == 0 && Q == 0)
		{
			break;
		}

		for (i = 0; i < N; i++)
		{
			scanf("%s", name[i]);
		}

		while (Q--)
		{
			scanf("%d", &p);
			if (N == 1)
			{
				printf("%s\n", name[0]);
			}
			else
			{
				printf("%s\n", name[calc(N, p)]);
			}
		}
		printf("\n");
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?