[noip 2012] 同余方程


大家都用 exgcd 之类的东西搞一点意思都没有。


我来讲讲自己的想法吧,
gcd(a, b) = 1
a^phi(b) = 1 (mod b)
x = a^(phi(b)-1) (mod b)

exgcd这么蛋疼东西我才不会呢!


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <vector>
#include <utility>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(!x) {putchar('0');return;}
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    while(sl) putchar(s[--sl]);
}

long long a, b, phi;

long long power_mod(long long x,int k)
{
    long long r = 1;
    while(k)
    {
        if(k&1) r *= x, r %= b;
        x *= x, x %= b, k >>= 1;
    }
    return r;
}
int main()
{
    long long  t;

    read(a), read(b);

    t = phi = b;

    for(int i = 2; i * i <= b; i++)
    {
        if(!(t % i))
        {
            phi /= i, phi *= i - 1;
            while(!(t % i)) t /= i;
        }
    }
    if(t != 1) phi /= t, phi *= t - 1;

    write(power_mod(a, phi - 1));

    return 0;
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页