您的位置:首页 > 其它

HDU 1576 A/B

2016-07-02 23:50 246 查看
题目链接: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): 3960    Accepted Submission(s): 3043

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
 

Source

HDU 2007-1 Programming Contest

 

Recommend

linle

思路:费马小定理。假如p是质数,且(a,p)=1,那么a^(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。因为9973是质数,gcd(B, 9973)=1,所以B^(9973-1)≡1(mod 9973)。故结果为(A*B^(9973-2))%9973。详见代码。

附上AC代码:

#include <bits/stdc++.h>
//#pragma comment(linker, "/STACK:102400000, 102400000")
using namespace std;
typedef long long ll;
const int mod = 9973;
int a, b;

int qpow(int x, int n){
int ans = 1;
while (n){
if (n & 1)
ans = (1ll*(ans%mod)*(x%mod))%mod;
x = (1ll*(x%mod)*(x%mod))%mod;
n >>= 1;
}
return ans;
}

int main(){
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int T;
scanf("%d", &T);
while (T--){
scanf("%d%d", &a, &b);
int ans = (1ll*a*qpow(b, mod-2))%mod;
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 费马小定理 数论