码迷,mamicode.com
首页 > 其他好文 > 详细

济南学习 Day 2 T2 pm

时间:2016-11-07 09:36:09      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:turn   else   round   print   new   continue   问题   while   sort   


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

 

济南学习 Day 2 T2 pm

标签:turn   else   round   print   new   continue   问题   while   sort   

原文地址:http://www.cnblogs.com/suishiguang/p/6037446.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!