您的位置:首页 > 其它

NOIP2012提高组 同余方程

2016-11-03 20:35 246 查看


这道题是一道比较经典的水题,重点在于理解同余方程。

只需利用数论的定理就能够很轻松的解决。

参见下列代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  同余模算术 NOIP