您的位置:首页 > 其它

HDOJ-1576(数论)

2015-07-27 16:19 351 查看
看着像扩展欧几里得,努力往上面凑吧。

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