中國餘數定理相關

 

#include <iostream>
#include <stack>

using namespace std;

int find_inverse(int a, int n){

    if(n == 1)
        return 0;

    int tmp1, tmp2, tmp;
    stack<int> qstack;

    tmp1 = a;
    tmp2 = n;

    while(1){
        if(!tmp1 || !tmp2)
            return 0;

        if(tmp1 == 1 || tmp2 == 1)
            break;

        if(tmp1 >= tmp2){
            qstack.push(-tmp1/tmp2);
            tmp1 %= tmp2;
        }
        else
            swap(tmp1, tmp2);
    }

    if(qstack.empty())
        return 1;

    tmp1 = 1;
    tmp2 = qstack.top();
    qstack.pop();

    while(!qstack.empty()){
        tmp = tmp2;
        tmp2 = tmp1 + tmp2*qstack.top();
        tmp1 = tmp;
        qstack.pop();
    }

    if(a > n)
        return tmp1;
    else
        return tmp2;
}

int main()
{
    int a, n;
    int answer;

    while(cin >> a >> n){
        answer = find_inverse(a, n);

        if(answer){
            while(answer < 0)
                answer += n;

            cout << answer%n << endl;
        }
        else
            cout << "No Inverse\n";
    }
    return 0;
}
 

文章標籤
全站熱搜
創作者介紹
創作者 大神(偽) 的頭像
大神(偽)

大神的世界

大神(偽) 發表在 痞客邦 留言(0) 人氣(150)