我是好人2

Problem G: 我是好人2

Description

众所周知,我是好人,不会出太难的题,题意简单得很,给定L,R,N,K,问存在多少个数X满足以下条件:

1:L <= X <= R

2:X % N == K

总共T(<=100000)组数据,每组数据的数字都是不超过1000000000的正整数.

Input

 第一行组数T,第二行依次输入L,R,N,K,1个空格间隔开

Output

 只输出一行答案

Sample Input

3
1 1000000 1 0
1 1000000 2 0
1 1000000 3 1

Sample Output

1000000
500000
333334

思路:等价成数学问题

令 y=n*t+k

求 在y属于[l,r]区间上的所有整数解得个数。

关键求出最大和最小整数解,相除即可

最大整数:int maxnum=r-(r-k)%n;//[5 240],6--->4

最小:
先令y=0,求得t,再向上取整int  t=(l-k)%n==0?(l-k)/n:((l-k)/n+1);

int minnum=l-k>0?t*n+k:k;


package com.sinaapp.gdutcode;

import java.util.Scanner;

public class Problem1144 {
		public static void main(String[] args) {
			Scanner  cin=new Scanner(System.in);
			int  t=cin.nextInt();
			while (t-->0) {
				int  L=cin.nextInt();
				int  R=cin.nextInt();
				int  N=cin.nextInt();
				int  K=cin.nextInt();
				int  ans=f(L,R,N,K);
				System.out.println(ans);
			}
		}
		private static int f(int l, int r, int n, int k) {
//			 y=n*t+k----->  y % N == K
//			L <= y <= R
			if (l>r||n<=k||r<k) return 0;
			int maxnum=r-(r-k)%n;//[5 240],6--->4
			int  t=(l-k)%n==0?(l-k)/n:((l-k)/n+1);
			int minnum=l-k>0?t*n+k:k;
			if (minnum>r) return 0;//1 2 4 3
			return (maxnum-minnum)/n+1;
		}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值