A/B HDU

来源:互联网 发布:java的输入输出流 编辑:程序博客网 时间:2024/06/05 00:24

A/B



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
21000 5387 123456789
 

Sample Output
79226060
 

Author
xhd
 

Source
HDU 2007-1 Programming Contest
 

Recommend
linle


分析: 
从题目中可以得到
n=A%9973
gcd(B,9973)=1
A%B==0
所以可以得到
n=A-A/9973*9973
A=Bx
n=Bx-y*9973
所以可以用扩展欧几里德求解x
x=A/B再取%9973就可以了

AC代码:
#include<stdio.h>#include<string.h>long long kzgcd(long long a,long long b,long long &x,long long &y){if(b==0){x=1,y=0;return a;}long long ans=kzgcd(b,a%b,x,y);long long t=x;x=y;y=t-(a/b)*y;return ans;}long long solve(long long a,long long b,long long c){long long x,y;kzgcd(a,b,x,y);long long ans=(x*c)%b;if(ans<=0)ans+=b;return ans;}int main(){int T;scanf("%d",&T);while(T--){long long n,B;scanf("%lld%lld",&n,&B);printf("%lld\n",solve(B,9973,n));}}