Cod sursa(job #1057526)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 14 decembrie 2013 14:59:41
Problema Progresie Scor 0
Compilator cpp Status done
Runda ONIS 2014, Runda 1 Marime 1.14 kb
#include<stdio.h>
#include<vector>
#include<cstring>
#include<algorithm>

#define maxn 1005

using namespace std;

FILE*f=fopen("progresie.in","r");
FILE*g=fopen("progresie.out","w");

int n,r;

int main () {
	
	int tests;
	fscanf(f,"%d",&tests);
	
	while ( tests-- ){
		
		fscanf(f,"%d %d",&n,&r);
		long long dif = 1LL*(n-1)*r;
		long long left = 1,middle,right = 3000000000LL;
		
		long long sol = (dif+1)*(dif+1)-dif;
		while ( left <= right ){
			middle = (left+right)>>1;
			
			if ( middle*middle >= dif ){
				right = middle-1;
			}
			else{
				left = middle+1;
			}
		}
		
		for ( int i = 1 ; 1LL*i*i <= r+5 && i <= sol ; ++i ){
			
			long long now = i; int ok = 1;
			for ( int j = 1 ; j < n ; ++j ){
				now += r;
				
				long long left = 1,middle,right = 3000000000LL;
				while ( left <= right ){
					middle = (left+right)>>1;
					
					if ( middle*middle >= now ){
						right = middle-1;
					}
					else{
						left = middle+1;
					}
				}
				
				if ( left*left - left + 1 > now ){
					ok = 0;
					break ;
				}
			}
			
			if ( ok ){
				sol = i;
				break ;
			}
		}
		
		fprintf(g,"%lld\n",sol);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}