hdu1576

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2430    Accepted Submission(s): 1760

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

Recommend

linle

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<vector>
#include<set>
using namespace std;
#define MOD 9973
int t,n,b,ans;
void egcd(int a,int b,int &x,int &y)
{
      if(b==0)
      {
            x=1;
            y=0;
            return ;
      }
      else
      {
            egcd(b,a%b,x,y);
            int t=x;
            x=y;
            y=t-a/b*y;
      }
}
int main()
{
      int x,y;
      scanf("%d",&t);
      while(t--)
      {
            scanf("%d%d",&n,&b);
            egcd(b,MOD,x,y);
            x=n*x;
            ans=(x%MOD+MOD)%MOD;
            printf("%d\n",ans);
      }
      return 0;
}

  

时间: 2024-10-05 12:08:57

hdu1576的相关文章

【hdu1576】A/B——扩展欧几里得算法

扩展欧几里得的模板题,要记住: x=y1; y=x1-a/b*y1. 这道题的推导过程如下: 1.因为A/B==0,所以令A/B=x,即A=Bx.又因为n=A%m,所以m*y+n=A. 由上面可推导出Bx-my=n. 2.由扩展欧几里得算法可以算出B*x1+m*y1=1的根,等式两边同时乘上n可以变形为B*(x1*n)-m*(-n*y1)=n. 所以x=n*x1.到这里我们只需要通过扩欧算出x1,答案即为(x1*n)%m. 3.最后要注意的一点,扩展欧几里得算法算出的x1可能为负数,这显然是不成

hdu1576 A/B 数论

hdu1576 A/B逆元 扩展欧几里得 数论 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const int mod = 9973 ; 5 int T,n,A,B,inv,x,y,t ; 6 7 inline int read() 8 { 9 int x = 0 , f = 1 ; 10 char ch = getchar() ; 11 while(ch<'0'||ch>'9') { if(ch=='-') f =

HDU-1576 A/B 基础数论+解题报告

HDU-1576 A/B 基础数论+解题报告 题意 求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973) (我们给定的A必能被B整除,且gcd(B,9973) = 1). 输入 数据的第一行是一个T,表示有T组数据. 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). 输出 对应每组数据输出(A/B)%9973. 解题思路 看到这里就能想到这个题是有关数论的了吧. 下面是对题目给的公式进行一些变形 设p=9973,令(C就是我们

HDU1576(扩展欧几里得)

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

HDU1576 A/B,模拟元

Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 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)

HDU1576 A/B(乘法逆元)

这题大概是,整数模9973乘法群?然后存在乘法逆元. 于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $. 只要求出B的逆元就OK了. 计算模n下的乘法逆元可以用用扩展欧几里得算法求解,即解下面的线性同余方程: $$ Ax \equiv 1 \pmod {n} $$ 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 #de

hdu1576 A/B 扩展欧几里得求逆元

//(a/b)%c ==> a%c = (b*k) %c; // k = (a*(b_1))%c ,b_1为b的逆元 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int mod = 9973 ; typedef __int64 ll; int exgcd(int a ,int b , ll &x ,ll &y) { if(b ==

hdu1576 扩展欧几里德 A/B

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

hdu1576(扩展gcd求乘法逆元)

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