HDU 1576 A/B(扩展欧几里德变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576

Problem Description

要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

Input

数据的第一行是一个T,表示有T组数据。

每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。

Output

对应每组数据输出(A/B)%9973。

Sample Input

2
1000 53
87 123456789

Sample Output

7922
6060

Author

xhd

Source

HDU 2007-1 Programming Contest

PS:

n = A%9973, 设A / 9973 = y;

A / B = x    --->>>>    A = B * x;

那么就有: B*x - 9973 * y =  n;

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
typedef __int64 LL;

LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    LL r = exgcd(b,a%b,x,y);
    LL t = x;
    x = y;
    y = t-a/b*y;
    return r;
}

LL cal(LL a, LL b, LL c)
{
    LL x, y;
    LL tt = exgcd(a, b, x, y);
    if(c%tt)
        return -1;
    x *= c/tt;
    b/=tt;
    if(b < 0)
        b = -b;
    LL ans = x%b;
    if(ans < 0)
        ans += b;
    return ans;
}
int main()
{
    LL n, b;
    LL t;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&b);
        LL ans = cal(b,9973,n);
        if(ans == -1)
            printf("Impossible\n");
        else
            printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-21 12:30:18

HDU 1576 A/B(扩展欧几里德变形)的相关文章

HDU 1576 A/B(扩展欧几里德变形)

一道扩展欧几里德的变形题目 题中给出 n = A%9973 → n = A - A/9973*9973(若x = A%B 则 x = A - A/B*B) 因为A能整除B 所以设x = A/B → A = B*x 所以原式 = B*x - A/9973*9973 = n 设y = A/9973 B*x - 9973y = n 然后利用扩展欧几里德求出x即可. #include <iostream> #include <cstdio> #include <algorithm&g

HDU 1576 A/B 扩展欧几里德算法

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2017    Accepted Submission(s): 1469 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个

HDU 2669 Romantic(扩展欧几里德)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2669 Problem Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees Trees are Shaking, Leaves are Falling. Lovers Walk passing, and so are You. ..........

HDU - 1576 A/B(扩展欧几里得算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 普通版欧几里得算法(辗转相除): 1 typedef long long LL; 2 LL gcd(LL a,LL b){ 3 return (b==0) ? a : gcd(b,a%b); 4 } 扩展欧几里得算法(理论):对于不完全为0的非负整数,

hdu 1576 A/B (扩展欧几里得)(还得再看看)

1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<string> 5 #include<math.h> 6 #include<stack> 7 #include<cstdlib> 8 #include<set> 9 #include<map> 10 #include<cstring> 11 #incl

hdu 1576 A/B (扩展欧几里德简单运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3351 Accepted Submission(s): 2545 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必

HDU 1576 A/B【扩展欧几里德】

设A/B=x,则A=Bx n=A%9973=A-9973*y=Bx-9973*y 用扩展欧几里德求解 #include<stdio.h> #include<string.h> typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y){ if(!b){ x=1,y=0; return a; } ll ans=ex_gcd(b,a%b,y,x); y-=a/b*x; return ans; } void cal(ll

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

HDU 1222 Wolf and Rabbit (扩展欧几里德应用)

Wolf and Rabbit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6292    Accepted Submission(s): 3142 Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1.