【HPU-2016校賽-J】Judge


點擊打開鏈接



Judge
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

Ocean從影視城回來後,吃了一個放大果實(惡魔果實的一種),高呼:“海賊王に、俺はなる!

Ocean每使用一次能力,就可以將一個物品的價值放大$x$倍(原價值乘以$x$)。 
但是哪有這麼好的事情? 
物品的價值是有限度的,姑且認爲物品的價值上界爲$M$。 
如果經過放大後物品的價值大於或者等於$M$,那麼該物品價值將恆定以$M$的值減少,直到小於$M$爲止。 
比如價值爲$19,M = 6$:要減少$3$次$M$,即$19 - 6 = 13,13 - 6 = 7,7 - 6 = 1 < 6。$ 

假設物品初始的價值爲$1$,Ocean會對該物品使用$N$次能力。 
他想知道經過$N$次放大之後,物品的價值是否大於$Y$?

Input

第一行輸入一個整數$T$,代表有$T$組測試數據。 
每組數據依次輸入四個整數$x,N,M,Y,$分別代表上面提到的信息。 

注:$1 <= T <= 100000,1 <= x, N <= 10^9,1 <= M <= 10^9,|Y| <= 2 * 10^9。$

Output

若最後物品的價值大於$Y$請輸出"YES",反之輸出"NO"。(輸出結果不帶引號)

Sample Input

2
2 3 5 4
3 10 7 3 

Sample Output

NO
YES 

Hint

對第一組測試數據,

第一次放大後物品價值爲$2,2 < 5,$不減少。

第二次放大後物品價值爲$4,4 < 5,$不減少。

第三次放大後物品價值爲$8,8 > 5,$每次減少$5$,則$8 - 5 = 3 < 5$合法。

最後價值爲$3,3 < 4。$



//                        題解:快速冪 

//代碼如下:

#include <stdio.h>
int main()
{
	int t;
	scanf ("%d",&t);
	while (t--)
	  {
	    long long int x,n,m,y;
	  	scanf ("%lld%lld%lld%lld",&x,&n,&m,&y);
	    long long int r = 1; 
		x = x % m;
	    while(n)
	     {
	       {
	       	if (n % 2 == 1)
	       	 r = (r*x)%m;
	        n = n / 2;
	       	x = (x*x)%m;
		   }
		 }
		if (r > y)
		 printf ("YES\n");
		else
		 printf ("NO\n");
	  }
	return 0;
}


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