A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8982 Accepted Submission(s): 7181
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 | We have carefully selected several similar problems for you: 1788 1211 1787 1299 1573
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
ll e_gcd (ll a, ll b, ll& x, ll& y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
ll ans = e_gcd (b, a % b, y, x);
y -= a / b * x; //这个和前面用的方法不一样,不过是对的,写起来更快、
return ans;
}
ll Cal(ll a,ll b,ll c)//求最小的x使ax+ by = c
{
ll x,y;
ll gcd = e_gcd(a,b,x,y);
if (c%gcd) return -1;//无解
x*=c/gcd;
b /= gcd;
if (b < 0) b = -b;
ll ans = x%b;
if (ans <= 0) ans += b;
return ans;
}
int main()
{
ll b,n,t;
cin>>t;
while(t--)
{
cin>>n>>b;
ll ans=Cal(b,9973,n);
if(ans==-1) printf("Impossible\n");
else printf("%lld\n",ans);
}
}