Cod sursa(job #1348284)

Utilizator RanKBrinduse Alexandru RanK Data 19 februarie 2015 16:58:28
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.73 kb

#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>

#include <math.h>

#define IN_FILE_NAME "progresie.in"
#define OUT_FILE_NAME "progresie.out"

int CheckNr(int nr)
{
	int sqrtInt = (int)(sqrt(1.0 * nr));
	double sqrtDouble = sqrt(1.0 * nr);

	if(sqrtDouble == sqrtInt) return 0;
	if(nr > sqrtInt * (sqrtInt + 1) && nr < (sqrtInt + 1) * (sqrtInt + 1))
		return 0;

	return sqrtInt * (sqrtInt + 1) + 1 - nr;
}

int main()
{
	freopen(IN_FILE_NAME, "r", stdin);
	freopen(OUT_FILE_NAME, "w", stdout);

	int tests = 0, t;
	scanf("%d", &tests);

	for(t=0; t<tests; t++)
	{
		int globalMove = 0;
		bool found = false;
		int maxMove = 0;
		int n=0, r=0;
		scanf("%d %d", &n, &r);

		int i,j;
		for(i=1; i<n*r-1; i++)
		{
			maxMove = 0;
			int start = 1+i*(i-1)+globalMove;
			int stop = i*i;
			for(j=start; j<=stop; j++)
			{				
				int k;
				for(k=1; k<n; k++)
				{
					int localMove = CheckNr(j+k*r);
					if(maxMove < localMove) maxMove = localMove;
				}
				if(maxMove == 0)
				{
					found = true;
					printf("%d\n", j);
					break;
				}
				else
				{
					// Advance with at least maxMove positions
					if(start + maxMove <= stop) start += maxMove-1; // -1 because the for will increment it
					else
					{
						// find the next i
						int possibleStart = start + maxMove;

						// find the movement at that cycle						
						i = (int)(sqrt(possibleStart*1.0));
						
						if(possibleStart >= i*(i+1) + 1)
							globalMove = possibleStart - i*(i+1) - 1;							
						else
							globalMove = 0;
						break;
					}
				}
			}
			if(found) break;
			//printf("\n");
		}
		if(!found)
		{
			printf("%d\n", 1 + (n*r) * (n*r-1));
		}
	}
	return 0;
}