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。$
每組數據依次輸入四個整數$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;
}