10673

终于把这道扩展欧几里德的给做出来了。

扩展欧几里德是解决ax+by=c的方程的任意一组解时用的。因为有公理:ax+by=gcd(a,b);

故上述问题中求的x,y分别应该是x*(c/gcd(a,b)),y*(c/gcd(a,b));这就是一般通式的解;

因此解存在的条件是c%gcd(a,b) == 0;

//============================================================================
// Name        : 10673.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int N;
int x, y, n,  k, t1, t2,t;



int exGcd(int a, int b)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    int r = exGcd(b, a%b);
    int t = x;
    x = y;
    y = t - a/b*y;
    return r;
}

int main() {
	freopen("a.txt", "r", stdin);
	scanf("%d", &N);
	while(N--){
		scanf("%d%d", &n, &k);
		t1 = floor(n*1.0/k);
		t2 = ceil(n*1.0/k);
		t = exGcd(t1, t2);
		printf("%d %d\n", x*(n/t), y*(n/t));
	}
	return 0;
}

posted @ 2011-06-07 16:23  KOKO's  阅读(434)  评论(0编辑  收藏  举报