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

Posted wtsruvf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于Play with Floor and Ceil UVA - 10673(拓展欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

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

将 `std::floor()` 和 `std::ceil()` 转换为整数类型是不是总是给出正确的结果?

将十进制数字截取到 2 位,但不应使用 ceil 或 floor 将其四舍五入

[C/JAVA] ceil, floor

[C/JAVA] ceil, floor

Jquery Math ceil()floor()round()比较与用法