A/B
A/B
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 14 Accepted Submission(s) : 12
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
题目大意:
第一行输入一个数字T,表示有T组测试样例。
紧接着又T行,每一行输入两个数字,A,B;(A可以很大,直接除的话,k会直接溢出,需要利用公式进行化解)
利用公式:x^(p-1)%p=1 ——》x^(p-2)%p=1/x;(p与x是互质的即可)
因为,由题目所知:gcd(B,9973) = 1。——》B^(9973-2)%9973=1/B
所以(A/B)%9973,——》(A*(1/B))%9973——》(A*(B^(9973-2)%9973))%9973;((A%9973)*(B^9971%9971%9973))%9973);
1 #include <stdio.h> 2 int main() 3 { 4 int A,B,T,num,i; 5 scanf("%d",&T); 6 while(T--) 7 { 8 scanf("%d%d",&A,&B); 9 for(i=1,num=1;i<=9971;i++)/*计算B^(p-2)*/ 10 num=((B%9973)*(num%9973))%9973; 11 printf("%d\n",((A%9973)*(num%9971%9973))%9973); 12 } 13 return 0; 14 }
修改:2015.6.1
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 void Deal(int a,int b) 6 { 7 int i,c; 8 for(i=0,c=1;i<9971;i++)/*计算B^(p-2)*/ 9 { 10 c=((c%9973)*(b%9973))%9973; 11 } 12 printf("%d\n",(a*c)%9973); 13 14 } 15 int main() 16 { 17 int T,i,j,k,a,b; 18 scanf("%d",&T); 19 while(T--) 20 { 21 scanf("%d%d",&a,&b); 22 Deal(a,b); 23 } 24 }
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************