逆元:

  同余方程 ax≡1(mod n),gcd(a,n) = 1 时有解,这时称求出的 x 为 a 的对模n的乘法逆元。(注意:如果gcd(a,n)如果不等于1则无解),解法还是利用扩展欧几里得算法求解方程 ax + ny = 1 求出 x。

 1     /**
 2      * 求逆元
 3      * ax = 1 (% mo),gcd(a,mo)=1
 4      * ax+mo*y=1
 5      * */
 6     public static long inverseElement(long a, long mo) throws Exception {
 7
 8       long d = linearEquation(a, mo, 1);//ax+mo*y=1
 9       x = (x % mo + mo) % mo;//保证x>0
10       return d;
11     }

题目:HDU-1576

  

  思路:设(A/B)%9973 = k, 则A/B = k + 9973x  (x未知), 因此A = kB + 9973xB,又A%9973 = n, 所以kB%9973 = n,  故kB = n + 9973y (y未知),故(k/n)B +(-y/n)*9973 = gcd(B,9973) = 1扩展欧几里得 求出k/n,  再乘以个n,记得取模,就是answer了。

  代码:

 1 import java.util.Scanner;
 2
 3 /**
 4  * (A/B)%9973,求余,除法不满足交换性,可改为求B关于9973的逆元x,
 5  * 这样结果等价于Ax%9973等价于x*A%9973等价于xn%9973,
 6  */
 7
 8 public class HDU1576 {
 9
10     public static void main(String[] args) {
11         Scanner scanner = new Scanner(System.in);
12         int T = scanner.nextInt();
13         for (int i = 0; i < T; i++) {
14             int n = scanner.nextInt();
15             int b = scanner.nextInt();
16             try {
17                 MyGcd.inverseElement(b, 9973);
18                 long x = MyGcd.x;
19                 System.out.println(x*n%9973);
20             } catch (Exception e) {
21                 // TODO: handle exception
22             }
23         }
24     }
25
26     private static class MyGcd{
27         static long x;
28         static long y;
29
30         public static long gcd(long m, long n) {
31             return n == 0 ? m : gcd(n, m % n);
32         }
33
34         public static long ext_gcd(long a,long b){
35             if (b==0) {
36                 x = 1;
37                 y = 0;
38                 return a;
39             }
40             long res = ext_gcd(b, a % b);
41             long x1 = x;
42             x = y;
43             y = x1 - a / b * y;
44             return res;
45         }
46
47         public static long linearEquation(long a, long b, long m) throws Exception {
48             long d = ext_gcd(a, b);
49             if (m % d != 0) {
50                 throw new Exception("无解");
51             }
52             long n = m / d;
53             x *= n;
54             y *= n;
55             return d;
56         }
57
58         public static long inverseElement(long a, long mo) throws Exception {
59
60             long d = linearEquation(a, mo, 1);// ax+mo*y=1
61             x = (x % mo + mo) % mo;// 保证x>0
62             return d;
63         }
64     }
65 }

  结果:

    

 

转载于:https://www.cnblogs.com/xiaoyh/p/10332966.html

【逆元】HDU-1576相关推荐

  1. hdu 1576 A/B

    文章目录 题目: 题解: 代码: hdu 1576 题目: 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). I ...

  2. HDU 1576 A/B(数论简单题,求逆元)

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

  3. A/B HDU - 1576 (逆元或拓展欧几里得或数学公式)多解法求大数结果

    题意:求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 思维:(1)逆元+扩展欧几里得算法:满足a*k≡1 (mo ...

  4. 【HDU 1576】 A/B

    Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一 ...

  5. hdu 1576(拓展欧几里得)

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

  6. acm数论之欧几里得gcd

    1.欧几里得定理 同余定理的公式:(a+b)%mod=(a%mod+b%mod)%mod (a*b)%mod=(a%mod*b%mod)%mod 扩展欧几里得也有自己的一个公式:a*x+b*y=gcd ...

  7. 数论杂谈(欧拉定理与费马小定理结论与应用)

    文章目录 欧拉定理: 欧拉定理性质: 扩展欧拉定理: 费马小定理: 指数循环节 费马大定理 逆元: 例题 原根 定义: 原根存在条件 例题 快速幂 代码 矩阵快速幂 原理: 代码: 欧拉定理: aφ( ...

  8. 同余 --算法竞赛专题解析(22):数论

    本系列文章将于2021年整理出版.前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当   作者签名书:点我 公众号同步:算法专辑    暑假福利:胡说三国 有建议请加QQ ...

  9. 欧几里德算法 扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数. 计算公式:gcd(a,b) = gcd(b,a mod b). 算法实现: public static int g ...

  10. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

最新文章

  1. SAP RETAIL 商品主数据里的X-DChain Status字段
  2. 寒武纪开盘暴涨350%,市值突破1000亿,85后创始人身家超300亿!千亿盛宴背后隐忧不可忽视!...
  3. 2021年春季学期-信号与系统-第十一次作业参考答案-第一小题
  4. 上天探索脉冲星,下海保护白海豚,腾讯这个AI团队,今年真的有点忙
  5. Cannot add or update a child row:
  6. python断言assert实例_Python断言assert的用法代码解析
  7. 从SpringBootApplication注解入手
  8. 《云计算:概念、技术与架构》一1.1 本书目标
  9. 【TensorFlow】TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型
  10. 求n的阶乘java_Java 求n的阶乘
  11. 洛谷P1238 走迷宫
  12. box2dweb基础
  13. synchronize原理以及和CAS的浅层比较
  14. 给予redis和zookeeper的分布式锁
  15. 日记侠:要赚钱千万别多想立刻开干
  16. 学习方法-北大学霸(01)学习方法基础
  17. 一位老人告诉我的人生哲理
  18. 253短信发送(国内短信)
  19. 浅谈信息安全等级保护与ISO27000系列标准的异同
  20. MFC应用模态对话框和非模态对话框

热门文章

  1. Ubuntu系统多屏幕时 触摸屏如何分屏定位
  2. [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
  3. erlang怎样有效监听大量并发连接
  4. linux io ports io memory
  5. 使用 Visual Studio Code 编写 TypeScript
  6. NGINX反向代理部署
  7. 华为的IPsec ×××主模式(MAIN mode)
  8. 1 月份 Github 上最热门最有价值的开源项目
  9. 作为面试官,最近面试 Java 后端的感受!
  10. 没有对比就没有伤害,优秀的代码VS糟糕的代码