A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4431 Accepted Submission(s): 3428
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)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2 1000 53 87 123456789
Sample Output
7922 6060
一,扩欧:
A/B=x ---->A=Bx;
n=A%9973 ----->A=9973*y+n;
得:
Bx+9973y=n
BX1+9973Y1=Gcd(B,9973)=1;
所以:x=X1*n
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
void swap(int x,int y)
{
int t;
t=x;x=y;y=t;
}
void Exgcd(LL a,LL b,LL &x,LL &y)//&x,&y 为x,y的地址
{
if(b==0)
{
x=1;
y=0;
return ;
}
else
{
Exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
}
int main()
{
int t;
long long n,B;
long long x,y;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&B);
if(B<9973)
swap(B,9973);
Exgcd(B,9973,x,y);
x=x*n;
x=((x%9973)+9973)%9973; //x可能为负数
printf("%lld\n",x);
}
return 0;
}
二,数学思维(求余)
设 X= (A/B)%9973, ----->A/B=9973*m+X ----->A=9973*m*B+X*B ;
设 n=A%9973 ----->A=9973*k+n ;
化简:BX - n =9973 (m-Bk) 常数 满足(BX -n)%9973==0 其中(x<=9972)
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
int t,n;
LL B; //要开到 long long
int x;
scanf("%d",&t);
while(t--)
{
scanf("%d%lld",&n,&B);
for(int i=0;i<9973;i++)
{
if((B*i-n)%9973==0)
{
x=i;
break;
}
}
printf("%d\n",x);
}
return 0;
}