hdu 1576 A/B 欧几里德算法的扩展

A/B

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2580    Accepted Submission(s): 1884

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

一个数论题目

欧几里德扩展运算

n=A%9973  就有 n=A-9973*r

A%B==0         A=l*B

(A/B)%9973   ans= l%9973

所以有 ans=l-m*9973

其中ans就是我们需要的答案

A=L*B=n+9973*r=B*(ans+m*9973)

n+9973*r=B*ans+9973*m*B

n-B*ans=(m*B-r)*9973

所以只要枚举(n-B*ans)%9973==0 就可以了

代码:

#include <stdio.h>

int main()
{
	int t ;
	scanf("%d",&t) ;
	while(t--)
	{
		long long n , b ;
		scanf("%I64d%I64d",&n,&b) ;
		for(int i = 0 ; i < 9973 ; ++i)
		{
			if((n-b*i)%9973 == 0)
			{
				printf("%d\n",i) ;
				break ;
			}
		}
	}
	return 0 ;
}

与君共勉

时间: 2024-10-28 11:42:37

hdu 1576 A/B 欧几里德算法的扩展的相关文章

HDU 1576 A/B(欧几里德算法延伸)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目: 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. S

欧几里德算法与扩展欧几里德算法

欧几里得算法就是我们常说的辗转相除法,辗转相除法可以用来求最大公约数,知道最大公约数还可以求最小公倍数.gcd在好像也有库函数__gcd int Gcd(int a, int b) { while(b != 0) { int r = b; b = a % b; a = r; } return a; } 非递归方法 int gcd(int a,int b) {return b ? gcd(b,a%b) : a;} 递归方法 扩展欧几里得算法是在解决一个什么问题呢,解方程,解二元一次方程的通解. 扩

数学(1.费马定理 2.扩展欧几里德算法 3.莫比乌斯反演)

费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1) ≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1. 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理).扩展欧几里德常用在求解模线性方程及方程组中. 欧几里德算法的扩展 扩展欧几里德算

HDU 1576 A/B 扩展欧几里德算法

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

hdu 1576 A/B (扩展欧几里德简单运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3351 Accepted Submission(s): 2545 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

HDU 1576 A/B(扩展欧几里德变形)

一道扩展欧几里德的变形题目 题中给出 n = A%9973 → n = A - A/9973*9973(若x = A%B 则 x = A - A/B*B) 因为A能整除B 所以设x = A/B → A = B*x 所以原式 = B*x - A/9973*9973 = n 设y = A/9973 B*x - 9973y = n 然后利用扩展欧几里德求出x即可. #include <iostream> #include <cstdio> #include <algorithm&g

扩展欧几里德算法详解

扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法,用 C++ 语言描述如下: 由于是用递归写的,所以看起来很简洁,也很好记忆.那么什么是扩

扩展欧几里德算法

文章来源:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了