标签: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 }
标签:turn else round print new continue 问题 while sort
原文地址:http://www.cnblogs.com/suishiguang/p/6037446.html