zoukankan      html  css  js  c++  java
  • HDU 1576 A/B(扩展欧几里德变形)

    一道扩展欧几里德的变形题目

    题中给出 n = A%9973 → n = A - A/9973*9973(若x = A%B 则 x = A - A/B*B)

    因为A能整除B 所以设x = A/B → A = B*x 

    所以原式 = B*x - A/9973*9973 = n 设y = A/9973

    B*x - 9973y = n

    然后利用扩展欧几里德求出x即可。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cstring>
    using namespace std;
    int n, B, T;
    int gcd(int  a, int b){  
         if(b == 0) return a;
         return gcd(b, a%b);
    }
    void exgcd( int a, int b, int &x, int &y ){
        if( b== 0 ){
            x= 1;
            y= 0;
            return;
        }
        exgcd( b, a% b, x, y );
        int t = x;
        x = y;
        y= t- a/ b* y;
        return;
    }
    int main(){
        scanf("%d", &T);
        while(T--){
            scanf("%d%d", &n, &B);
            int a = B;
            int b = 9973;
            int m = n;
            int d = gcd(a,b);
            int a1, b1, m1,x ,y;
            a1 = a/d; b1 = b/d; m1 = m/d; 
            exgcd(a1, b1, x, y);
            int x1 = x*m1;
            int ans = x1%b1;
            while(ans < 0){
                ans += b1;
            }
            printf("%d
    ", ans%9973);
            
        }
        return 0;
    }
  • 相关阅读:
    邪恶的强制数据转换
    知识普及
    判断是否为一个数字
    parseInt
    webpack学习记录
    数组隐藏属性
    elasticSearch基本使用
    elasticsearch安装和部署
    neo4j索引
    spark yarn 提交作业
  • 原文地址:https://www.cnblogs.com/titicia/p/3874374.html
Copyright © 2011-2022 走看看