UVa 10673 Play with Floor and Ceil(扩展欧几里得)
题意:
给定x, k,求p, q使得:
思路:
http://blog.csdn.net/fioman/article/details/2455698
利用扩展的欧几里得定理,ax + by = gcd(a, b);x, y一定有整数解。
ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2=bx2+(a-(a/b)*b)y2
#include <cstdio> #include <cstring> #include <cstring> #include <cmath> void gcdextend(int a, int b, int &d, int &x, int &y) { if (!b) d = a, x = 1, y = 0; else gcdextend(b, a%b, d, y, x), y -= x * (a/b); } int main() { int cases; scanf("%d", &cases); while (cases--) { int a, b, c, k; scanf("%d %d", &c, &k); a = (int)floor(1.0*c/k); b = (int)ceil(1.0*c/k); int d, x, y; gcdextend(a, b, d, x, y); x *= (c / d); y *= (c / d); printf("%d %d\n", x, y); } return 0; }
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------