ZOJ

来源:互联网 发布:视频加速器软件 编辑:程序博客网 时间:2024/06/05 17:35

考查扩展欧几里德


// 数论-扩展欧几里德#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <string>#include <queue>#include <stack>#include <algorithm>#define INF 0x7fffffff#define EPS 1e-12#define MOD 1000000007#define PI 3.141592653579798#define N 100000using namespace std;typedef long long LL;LL e_gcd( LL a, LL b, LL &x, LL &y ) {    if( b == 0 ) {        x = 1;        y = 0;        return a;    }    LL ans = e_gcd( b, a % b, x ,y );    LL temp = x;    x = y;    y = temp - a / b * y;    return ans;}LL cal( LL a, LL m, LL c ) {    LL x, y;    LL gcd = e_gcd( a, m, x, y );   // 判断求得的最大公约数gcd是否是1    if( c % gcd != 0 ) return -1;    x = x * ( c / gcd );    m = m / gcd;    if( m < 0 ) m = -m;    LL ans = x % m;    if( ans <= 0 ) ans = ans + m;    return ans;}int main() {    int T;    scanf( "%d", &T );    while( T-- ) {        LL a, m;        scanf( "%lld%lld", &a, &m );        LL ans = cal( a, m, 1 );        if( ans == -1 ) printf( "Not Exist\n" );        else printf( "%lld\n", ans );    }    return 0;}


0 0