我是好人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||r4
			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;
		}
}



你可能感兴趣的:(数学方法求解)