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;
}
}