济南学习 Day 2 T2 pm
她
【问题描述】
给你L,R,S,M,求满足L≤ (S × x) mod M ≤ R最小的正整数 X。
【输入格式】
第一行一个数T代表数据组数。
接下来一行每行四个数代表该组数据的L,R,S,M。
【输出格式】
对于每组数据,输出一行代表答案。如果不存在解,输出“−1” 。
【样例输入】
1
5 4 2 3
【样例输出】
2
【样例解释】
叫南小鸟。
【数据规模与约定】
30%的数据,保证有解且答案不超过10^ 6 。
另外20%的数据,L = R。
对于100%的数据,1 ≤ T ≤ 100,0 ≤ M,S,L,R ≤ 10 ^9
1 #include<cstdio>
2 #include<algorithm>
3 using namespace std;
4 const int N=1e5+10;
5 int a[N],top;
6 int erfen(int x){
7 int l=1,r=top,mid,res=0;
8 while(l<=r){
9 mid=(l+r)>>1;
10 if(a[mid]>=x) res=mid,r=mid-1;
11 else l=mid+1;
12 }
13 return res;
14 }
15 int main(){
16 freopen("she.in","r",stdin);
17 freopen("she.out","w",stdout);
18 int i,j,k,n,m,s,l,r,x,now,t,ans,ans2;
19 bool fl;
20 scanf("%d",&t);
21 while(t--){
22 scanf("%d%d%d%d",&m,&s,&l,&r);
23 if(l>=m){printf("-1\n");continue;}
24 if(r>=m)r=m-1;
25 now=0;fl=0;
26 top=0;
27 for(n=1;n*n<=m;n++){
28 now=(now+s)%m;
29 if(l<=now&&now<=r){
30 printf("%d\n",n);
31 fl=1;break;
32 }
33 a[++top]=now;
34 }
35 --n;
36 int ste=a[top];
37 if(fl) continue;
38 sort(a+1,a+top+1);
39 for(now=1;now*n<=m;now++){
40 l=(l-ste+m)%m;r=(r-ste+m)%m;
41 if(l>r) {
42 if(a[top]>=l){fl=1;break;}
43 if(a[1]<=r){fl=1;break;}
44 }
45 else{
46 if(a[top]<l) continue;
47 int x=erfen(l);
48 if(a[x]<=r){fl=1;break;}
49 }
50 }
51 if(!fl){printf("-1\n");continue;}
52 ans=now*n;
53 now=0;
54 for(i=1;i<=top;i++){
55 now=(now+s)%m;
56 if(l<=now&&now<=r)break;
57 }
58 ans+=i;
59 printf("%d\n",ans);
60 }
61 return 0;
62 }