首页 > 其他 > 详细

一些板子

时间:2019-11-07 15:57:45      阅读:73      评论:0      收藏:0      [点我收藏+]

在此记录一些本人百打百挂的板子:

1. 扩展欧几里得(以青蛙的约会为模板)

    题意:给出n,m,x,y,l,求g*l+k*(n-m)=x-y中k的最小正整数解

    做法:明显是扩欧板子虽然我不会写

       注意n-m为负数时,将n-m与x-y同时取相反数即可

             记住x=y1,y=x1-a/b*y1

             当求出ax+by=gcd(a,b)的特解后,通解为y=y0-(a/gcd)*t,x=x0+(b/gcd)*t

             上代码

 

技术分享图片
#include <cstdio>

inline long long int gcd(long long int a,long long int b){return b==0?a:gcd(b,a%b);}

inline void exgcd(long long int a,long long int b,long long int &x,long long int &y){
    if(b==0){
        x=1,y=0;
        return;
    }
    
    long long int x1,y1;
    exgcd(b,a%b,x1,y1);
    x=y1,y=x1-a/b*y1;
    return;
}

int main(void){
    long long int xx,yy,mm,nn,ll;
    scanf("%lld%lld%lld%lld%lld",&xx,&yy,&mm,&nn,&ll);
    
    long long int a=ll,b=mm-nn,c=yy-xx;
    if(b<0)    b=-b,c=-c;
    long long int d=gcd(a,b);
    
    if(c%d){
        printf("Impossible");
        return 0;
    }
    
    else{
        a/=d,b/=d,c/=d;
        
        long long int x,y;
        exgcd(a,b,x,y);
        
        printf("%lld\n",((y*c)%a+a)%a);
    }
}
青蛙的约会

 

 

 

一些板子

原文:https://www.cnblogs.com/Pride205/p/11811558.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!