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

题目:要求(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

题目分析:

1.已知n,B的值,要求(A/B)%9973的结果。其中n=A%9973,gcd(B,9973)=1;

假设 ans 是(A / B)%9973的结果,即(A / B)%9973=ans

可知存在一个x使得 9973*x+ans=(A / B)

所以:A=9973*Bx+ans*B..........(1)

又因为 n=A%9973,所以存在一个y ,使得A=9973*y+n.............(2)

由(1)(2)式得9973*y+n=9973*Bx+ans*B

转换后得:n=9973Bx+ans*B-9973y=9973(Bx-y)+ans*B====>(两边同时除以n后得到)(ans/n)*B+(Bx-y)/n*9973=1........(3)

由已知gcd(B,9973)=1......(4)

由(3)(4)条件得知,可以将式子看成是ax+by=1的形式

运用扩展欧几里得算法能够求出  ans/n  的值(假设为res),最终的结果为 res*n;

代码实现:

#include<cstdio>
#include<iostream>
using namespace std;
void exgcd(int a,int b,int &x,int &y)
{
  if(b==)
  {
   x=;
   y=;
   return ;
  }
  exgcd(b,a%b,x,y);
int t=x;
   x=y;
   y=t-a/b*y;
}
int main()
{
int T,n,b,x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&b);
exgcd(b,,x,y);
x=x*n;
x=(x%+)%;//防止x为负数
printf("%d\n",x);
}
return ;
}

hdu1576(扩展欧几里得)的更多相关文章

  1. HDU1576(扩展欧几里得)

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)

    http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...

  3. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  4. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

  5. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  6. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  7. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  8. poj 2142 扩展欧几里得解ax+by=c

    原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里 ...

  9. poj 1061 扩展欧几里得解同余方程(求最小非负整数解)

    题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...

  10. Codeforces7C 扩展欧几里得

    Line Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

随机推荐

  1. CDH集群中YARN的参数配置

    CDH集群中YARN的参数配置 前言:Hadoop 2.0之后,原先的MapReduce不在是简单的离线批处理MR任务的框架,升级为MapReduceV2(Yarn)版本,也就是把资源调度和任务分发两 ...

  2. Linux常用命令(一)查看日志

    当日志文件存储很大时,需要Linux命令查看: Log 在目录 /var/log/   下 常用命令: tail head grep sed cat tac https://blog.csdn.net ...

  3. 一个DOS攻击木马的详细分析过程

    一个DOS攻击木马的详细分析过程 0×01 起因 网路流量里发现了大量的的1.exe的文件,而且一直在持续,第一感觉就像是一个木马程序,而且每个1.exe的MD5都不一样,对比发现只有几个字节不一样( ...

  4. nrm安装与使用

    1.什么是nrm nrm是一个npm源管理工具,使用它可以快速切换npm源. 2.安装 使用如下命令安装: npm install -g nrm 安装完后可使用 nrm -V 显示版本,注意是大写V. ...

  5. Linux内核中常见内存分配函数【转】

    转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...

  6. CC254x/CC2540/CC2541库函数速查(转)

    hci.h 转自:http://blog.csdn.net/xiaoleiacmer/article/details/44036607#t1 //分配内存,应用程序不应该调用这个函数. void *H ...

  7. 异步编程之使用yield from

    异步编程之使用yield from yield from 是 Python3.3 后新加的语言结构.yield from的主要功能是打开双向通道,把最外层的调用方法与最内层的子生成器连接起来.这两者就 ...

  8. Vistual Studio Community 2017 账号的许可证过期,公安网激活方法

    方法:   1.外网电脑打开Vistual Studio Community2017   2.在许可证过期弹窗中登陆账号即可自动下载许可证完成激活      许可证下载路径(C:\用户\user\Ap ...

  9. 安装最新版的2016版Pycharm后,激活码

    2016年安装Pycharm后,过段时间过期.亲测只需要复制以下激活码可以完美解决激活问题,又可以开心的写Python了.以下为激活码内容: BIG3CLIK6F-eyJsaWNlbnNlSWQiOi ...

  10. PYTHON-函数对象,嵌套,名称空间与作用域,闭包函数

    一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo pri ...