Judge (快速幂+同余)

1194: Judge [快速幂]

时间限制: 1 Sec  内存限制: 128 MB

提交: 1011  解决: 125  统计

题目描述

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$?

输入

第一行输入一个整数$T$,代表有$T$组测试数据。
每组数据依次输入四个整数$x,N,M,Y,$分别代表上面提到的信息。

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

输出

若最后物品的价值大于$Y$请输出"YES",反之输出"NO"。(输出结果不带引号)

样例输入

2
2 3 5 4
3 10 7 3

样例输出

NO
YES

提示

对第一组测试数据,
第一次放大后物品价值为$2,2 < 5,$不减少。
第二次放大后物品价值为$4,4 < 5,$不减少。
第三次放大后物品价值为$8,8 > 5,$每次减少$5$,则$8 - 5 = 3 < 5$合法。

最后价值为$3,3 < 4。$

ps:在这里给出快速幂的模板代码:

int pow2(int a,int b){
    int r=1,base=a;
    while(b!=0){
    if(b%2) r*=base;
    base*=base;
    b/=2;
    }
    return r;
}
取余情况时:

int result(int a,int b,int m)
{
    int d=1,t=a;
    while(b)
    {
        if(b&1)
            d=(d*t)%m;
        b/=2;
        t=(t*t)%m;
    }
    return d;
}
#include <stdio.h>
#include <algorithm>
using namespace std;
long long x; 
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
     int n,m,y;
	 long long k=1;
		scanf("%lld%d%d%d",&x,&n,&m,&y);
		while(n!=0)       //快速幂核心,当n不为零时构建循环 
		{
			if(n%2)            //如果n是奇数的话,让k和底数记录数相乘并同时对m取余 
			  k=(k*x)%m;       
			x=((x%m)*(x%m))%m; //让n为偶数情况下时记录底数的n次方并同时对m取余 
			n/=2;
		}
	    if(k>y)
	    printf("YES\n");
	    else 
	    printf("NO\n");
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值