Play with Floor and Ceil UVA - 10673(拓展欧几里得)

因为我现在还不会用这个。。。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;
}

 

posted @ 2018-07-17 17:12  WTSRUVF  阅读(175)  评论(0编辑  收藏  举报