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 }
View Code

 修改: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 }
View Code

 

posted @ 2014-08-22 13:03  Wurq  阅读(159)  评论(0编辑  收藏  举报