HDOJ-1576(数论)

来源:互联网 发布:百度蓝天算法 编辑:程序博客网 时间:2024/06/05 12:49

看着像扩展欧几里得,努力往上面凑吧。

令M=9973,X=A/B, Y=A/M

因为n=A%M=A-(A/M)*M=BX-MY

现在有BX-MY=n了,B和M是已知的,X,Y未知的,距离扩展欧几里得还差一点。

由于gcd(B,M)=1(题干里说了,要利用上),利用扩展欧几里得我们可以算出BX‘+MY’=1中X'和Y'的值、

(关于系数正负号的问题,还有待学习......)

X=N*X',最后为了防止X出现负数,需要处理一下。

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;typedef long long LL;const int m=9973;//计算 ax+by=gcd(a,b),返回gcd值,求出xyLL Ex_gcd(LL a, LL b, LL &x, LL &y){    LL d;    if(a==0 && b==0) return -1;    if(b==0)    {        x = 1;        y = 0;        return a;    }    d = Ex_gcd(b, a%b, y, x);    y -= a / b * x;    return d;}void work(){    LL n,b,x,y;    scanf("%I64d%I64d",&n,&b);    Ex_gcd(b,m,x,y);    x *= n;    //处理一下,防止出现X出现负数    x = (x % m + m) % m;    printf("%I64d\n", x);}int main(){    int T;    scanf("%d",&T);    while(T--)        work();    return 0;}



0 0
原创粉丝点击