NOIP2012提高组 同余方程

来源:互联网 发布:多邻国提醒连接网络 编辑:程序博客网 时间:2024/06/01 08:06

这里写图片描述
这道题是一道比较经典的水题,重点在于理解同余方程。
只需利用数论的定理就能够很轻松的解决。

参见下列代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cstdlib>using namespace std;int exgcd(int a,int b,int &x,int &y){    if(b==0){x=1,y=0;return a;}    int xx,yy;    int g=exgcd(b,a%b,xx,yy);    x=yy;    y=xx-(a/b)*yy;    return g; }void insolve(){     int a,b,c,x,y,k;     scanf("%d%d",&a,&b);         //ax+by==1     b=-b,c=1;                    //转化为ax-by==c;      int g=exgcd(a,b,x,y);            //得到一组解      //此题保证有解,不考虑c%g!=0     int x0=c/g*x,y0=c/g*y;        //接下来只需考虑如何得到最小正整数解                                   //通式:x0+k*b/g;     int exb=b/g;     k=-x0/exb;     if(exb>0) if(k*exb<-x0) k++;     if(exb<0) if(k*exb<-x0) k--;     printf("%d\n",x0+k*exb); }int main(){    insolve();    return 0;}
0 0