hdu1576 A/B (扩展欧几里德)

来源:互联网 发布:dm800台标编辑软件 编辑:程序博客网 时间:2024/06/05 12:47

http://acm.hdu.edu.cn/showproblem.php?pid=1576

A/B

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
21000 5387 123456789
 
Sample Output
79226060
方法一:

      由B|A得A=B*x,又A%M=n有A=M*y+n=B*x,则存在B*x+M*y=n;由gcd(B,M)==1则存在B*_x+M*_y=1; 则x=_x*n;x可能为负数,ans=(x%mod+mod)%mod;

 

#include<stdio.h>#include<iostream>using namespace std;const int mod=9973;void extendgcd(int a,int b,int &x,int &y){    if(b==0)    {        x=1;y=0;        return ;    }    else    {        extendgcd(b,a%b,x,y);        int tmp=x;        x=y;        y=tmp-a/b*y;    }}int main(){    int t,n,b,x,y;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&b);        extendgcd(b,mod,x,y);        x*=n;        x=(x%mod+mod)%mod;        printf("%d\n",x);    }    return 0;}
方法二:

设A/B%M=ans;则A/B=ans+M*x --> A=(ans+M*x)*B   -->   M*y+n=  ans*B + M*x*B  (下一步同模M)-->   n=(ans*B)%M  -->   n=(  ans*( B%M)  )%M;而 ans的范围是[0,9973);枚举ans即可;

#include "stdio.h"int main(){    int t,n,b,c;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&b);        b=b%9973;        for (c=0;c<9973;c++)        {            if (n==(b*c)%9973)            {                printf("%d\n",c);              break;          }         }    }}

原创粉丝点击