zoukankan      html  css  js  c++  java
  • 济南学习 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
    ");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);
     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
    ");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
    ",ans);
     60     }
     61     return 0;
     62 }

     

  • 相关阅读:
    Python多进程实现并行化随机森林
    Python多进程队列间传递对象
    Umlet和draw.io 使用心得
    简单认识Adam优化器
    使用BERT进行情感分类预测及代码实例
    【深度学习】深入理解Batch Normalization批标准化
    Vue插件总结
    Vue配置环境识别
    pc端微信上传BUG
    Vue原生订单列表
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6037446.html
Copyright © 2011-2022 走看看