zoukankan      html  css  js  c++  java
  • A/B(逆元)

    A/B

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


    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
     
     
     
    就是问你会不会求模的逆元,A/B 的模不能直接除了就取余,要当做 (A* (1/B) )%m 所以就是求 1/B(即B关于MOD的乘法逆元)
    费马小定理:  当m为质数的时候  A^(m-1) = 1   (mod m) 即  A^(m-2) = 1/A  (mod m)    两边都余 m
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 using namespace std;
     6 
     7 #define MOD 9973
     8 
     9 int main()
    10 {
    11     int T;
    12     cin>>T;
    13     while(T--)
    14     {
    15         int a,b;
    16         scanf("%d%d",&a,&b);
    17         b%=MOD;
    18         int c = b;
    19         for (int i=0;i<MOD-3;i++)
    20             c = (c*b)%MOD;
    21         a = (a*c)%MOD;
    22         printf("%d
    ",a);
    23     }
    24     return 0;
    25 }
    View Code

     还可以用扩展欧几里得求逆元,a*x = 1 (mod m) , x 是 a 的逆元,然后,方程等价于 a*x + m*y = 1 (mod m),扩展欧几里得可求得 x0 ,((x0% m)+m)%m 就是最小整数解

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <stdlib.h>
     4 using namespace std;
     5 #define MOD 9973
     6 
     7 int exgcd(int a,int b,int &x,int &y)
     8 {
     9     if (b==0)
    10     {
    11         x=1;
    12         y=0;
    13         return a;
    14     }
    15     int r = exgcd(b,a%b,y,x);
    16     y-=(a/b)*x;
    17     return r;
    18 }
    19 
    20 int main()
    21 {
    22     int T;
    23     cin>>T;
    24     while (T--)
    25     {
    26         int a,b;
    27         cin>>a>>b;
    28         int x,y;
    29         int r = exgcd(b,MOD,x,y);
    30         x=(x%MOD+MOD)%MOD;
    31         cout<<a*x%MOD<<endl;
    32     }
    33     return 0;
    34 }
    View Code
  • 相关阅读:
    Android ArrayAdapter使用
    Android 更改字体
    C# CRC16校验码 1.0
    获取当前主题颜色 Flutter
    C# 每个字节接受 处理串口数据 的方法
    C# CRC
    char* 与 string 互转
    typeof 子类获取父类
    flutter Row 垂直或水平放置多个widget
    flutter 容器 几种写法
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/6670786.html
Copyright © 2011-2022 走看看