您的位置:首页 > 产品设计 > 产品经理

济南学习 Day 2 T2 pm

2017-03-17 16:11 381 查看

【问题描述】
给你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
,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 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: