因为我现在还不会用这个。。。emm。。。蒟蒻。。。只看了 从来没用过。。。。所以切一道水题。。。练一下。。。
人家讲的很好 https://blog.csdn.net/u012860428/article/details/41259377
题目大意:求出满足要求的p和q,使得对于给定的x,k,,输出一组满足要求的p,q即可;
下面对于x,k进行讨论;
1、若x能被k整除,那么只要p+q=k即可;
2、如果不能被其整除,则领,那么,x=p*a+q*(a+1);相当于对于不定方程求解,易知,(a,a+1)=1,所以可以先用扩展欧几里得算法求出一组满足
ap + bq= d 的解 其中d = gcd(p,q)
然后 P = p * x/d Q = q * x/d 因为求的是 ap + bq= d 的解 而我们要求ap + bq = x 的解 x = d * x/d 所以 求出的p 和 q 都乘上 x/d即可
即为解
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 10010, INF = 0x7fffffff; void gcd(LL a, LL b, LL& d, LL& x, LL& y) { if(!b) { d = a; x = 1; y = 0; } else { gcd(b, a%b, d, y, x); y -= x*(a/b); } } int main() { int T; cin>> T; while(T--) { LL x, y, d, a, b, k, c; cin>> c >> k; if(c % k == 0) { cout<< 1 << " " << k-1 <<endl; } else { a = floor(c/(double)k); b = ceil(c/(double)k); gcd(a, b, d, x, y); x*=c/d; y*=c/d; cout<< x << " " << y <<endl; } } return 0; }