GDUT_排位賽題解報告_第1場_B. MooBuzz

題目:
Farmer John’s cows have recently become fans of playing a simple number game called “FizzBuzz”. The rules of the game are simple: standing in a circle, the cows sequentially count upward from one, each cow saying a single number when it is her turn. If a cow ever reaches a multiple of 3, however, she should say “Fizz” instead of that number. If a cow reaches a multiple of 5, she should say “Buzz” instead of that number. If a cow reaches a multiple of 15, she should say “FizzBuzz” instead of that number. A transcript of the first part of a game is therefore: 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16

Having a slightly more limited vocabulary, the version of FizzBuzz played by the cows involves saying “Moo” instead of Fizz, Buzz, and FizzBuzz. The beginning of the cow version of the game is therefore

1, 2, Moo, 4, Moo, Moo, 7, 8, Moo, Moo, 11, Moo, 13, 14, Moo, 16

Given NN(1N1091 \leq N \leq 10^9), please determine the NNth number spoken in this game.

Test cases 2-5 satisfy N106N\le 10^6.

Input
The input consists of a single integer, NN.

Output
Please print out the Nth number spoken during the game.

Example
inputCopy
4
outputCopy
7
Note
The 4th number spoken is 7. The first 4 numbers spoken are 1, 2, 4, 7, since we skip over any time a cow says “Moo”.

這活指的是逢3 5倍數的數都會抹去,問你第N個倖存者是誰。 這個題目做法有很多,比較簡單我認爲應該是二分還有預處理了,之前遇到這樣的題,那時候不會做二分,於是預處理了一下,但是現在數據加強,直接上二分,就可以

對倖存數字進行二分:

	LL left=0,right=1e18;
	while(left+1<right)
	{
		LL mid=(left+right)/2;
		if(mid-mid/3-mid/5+mid/15==n)
		{
			while(mid%3==0||mid%5==0)mid--;
			printf("%lld\n",mid);
			break;
		}
		else if(mid-mid/3-mid/5+mid/15<n)left=mid;
		else right=mid;
	}

代碼比較少,但是自己對二分這樣的東西有點不太自然,微調的時候總是要調半天,希望做多一點題目,然後回顧博客的二分題目來加深親切感。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章