zoukankan      html  css  js  c++  java
  • hdu2669与hdu1576(扩展欧几里德)

    模板:

    int Extend_Euclid(int a, int b, int &x, int &y){
            if(b == 0){
                x = 1; 

                y = 0;
                return a;
            }
            else{
                int gcd,t;
                gcd = Extend_Euclid(b, a%b, x, y);
                t = x;
                x = y;
                y = t - (a / b) * y;
                return gcd;
            }

        }

    详见:http://www.cnblogs.com/yuelingzhi/archive/2011/08/13/2137582.html

    hdu 2669

    Sample Input
    77 51 10 44 34 79
     
    Sample Output
    2 -3 sorry 7 -3

    求 a*x + b*y = 1。输出一个正数x,一个y。

    直接套模板,最后对x < 0时处理一下,∵a*x + b*y = 1,所以x+=b,y-=a来保持值不变


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <cmath>
    #include <algorithm>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    const int N=100050;
    
    
    ll ex_gcd(ll a,ll b,ll &x,ll &y)          //扩展欧几里德
    {
        if(b ==0)
        {
            x = 1;y = 0;
            return a;
        }
        else
        {
            ll t = ex_gcd(b,a%b,y,x);
            y = y - x*(a/b);
            return t;
        }
    }
    
    int main()
    {
        ll a,b;
        while(scanf("%I64d%I64d",&a,&b)!= EOF)
        {
            ll x,y;
            ll tmp = ex_gcd(a,b,x,y);
            if(1 % tmp)
                printf("sorry
    ");
            else
            {
                while(x < 0){
                    x += b;
                    y -= a;
                }
                printf("%I64d %I64d
    ",x,y);
            }
        }
        return 0;
    }
    

      


    hdu 1576

    Problem Description
    要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
     
    Input
    数据的第一行是一个T,表示有T组数据。
    每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
     
    Output
    对应每组数据输出(A/B)%9973。
     
    Sample Input
    2 1000 53 87 123456789
     
    Sample Output
    7922 6060

    A % B = 0,A= Bx;

    n = A%9973  , A  = 9973y + n;   Bx -9973y  = n;

    GCD(b,9973) = 1,      b*x1 + 9973y1 = 1,    b*x1*n + 9973 *(n*y1) = n

    ∴ x = n*x1,  x1可以通多exGCD算出

    最后的x通过    (x % MOD + MOD)%MOD 防止出现负数


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <cmath>
    #include <algorithm>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    const int N=100050;
    
    
    void ex_gcd(int a,int b,int &x,int &y)          //扩展欧几里德
    {
        if(b ==0)
        {
            x = 1;y = 0;
        }
        else
        {
            ex_gcd(b,a%b,y,x);
            y = y - x*(a/b);
        }
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n,B;
            scanf("%d%d",&n,&B);
            int x,y;
            ex_gcd(B,9973,x,y);
            x *= n;
    
            printf("%d
    ",(x%9973 + 9973)% 9973);            //再加上一次,防止负
        }
        return 0;
    }
    

      









  • 相关阅读:
    [Python] 糗事百科文本数据的抓取
    [Python] 文件扫描
    [Python] 根据博客园用户名抓取其所有文章的标题及其链接
    ParagraphString
    IrregularGridCollectionView处理不定宽度的标签cell
    Java多线程与并发
    设计模式之代理模式
    javascript设置百分比保留两位小数。
    Java基础知识总结(异常机制、集合、JUC、IO)
    Java底层知识JVM、GC
  • 原文地址:https://www.cnblogs.com/Przz/p/5409793.html
Copyright © 2011-2022 走看看