算法很美:模的逆元

题目描述

  • 要求(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。

解析

  • (A/B)%9973=AxB关于9973的逆元%9973=nxB关于9973的逆元
  • 逆元:同余方程ax≡1 (mod n ),gcd(a,n)= 1时有解。a和n互为素数
    这时称求出的X为a的对模n的乘法逆元。

代码

public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int T=scanner.nextInt();
		for(int i=0;i<T;i++) {
			int n=scanner.nextInt();
			int B=scanner.nextInt();
			//求B的逆元
			ex_gcd.inverseElement(B, 9973);
			System.out.println(n*ex_gcd.x%9973);
		}
	}
	
	
	private static class ex_gcd {
		//方程的每一组jie
		static long x;
		static long y;
		public static void main(String[] args) {
			
		}
		//扩展欧几里得算法
		//返回 a b的最大公约数
		//同时每次跟新全局变量 获取裴蜀数
		public static long  exGcd(long a,long b) {
			if(b==0) {
				x=1;
				y=0;
				return a;
			}
			long res=exGcd(b, a%b);
			long x1=x;
			x=y;
			y=x1-a/b*y;
			return res;
		}
		
		//求线性方程 ax+by=m的解
		public static void linerEquation(long a,long b,long m) {
			if(m%exGcd(a, b)!=0) {
				System.out.println("无解");
			}else {
				long n=m/exGcd(a, b);
				x*=n;
				y*=n;
			}
		}
		
		//求a关于m的逆元 ax≡1 (mod m )   ax+nm=1
		private static void inverseElement(long a,long m ) {
			linerEquation(a, m, 1);
			m=Math.abs(m/1);
			//保证x为一个正数
			x=(x%m+m)%m;
		}

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值