hdu1825约束和+不互素求逆元

http://acm.hdu.edu.cn/showproblem.php?pid=1852

应用乘法逆元的充要条件就是两个数互素,即gcd(x,y) = 1

本题中,先求出m,即约数和,2008可以被分解为 2^3*251 

250作为分母被除然后对k取模,但是K不一定是素数,即不一定与250互素,所以不能求逆元,

我们应用公式  x/d%m = x%(d*m)/d 来求

所以在使用快速幂时 应对 d*m来取模,而不是m

#include
using namespace std;
typedef long long ll;
const int N = 1e6+100;
const int INF = 0x3f3f3f3f;
const int mod = 7;
ll n,k;
ll qp(ll a,ll b,ll c)
{
    ll ans = 1;
    while(b){
        if(b&1) ans = ans * a % c;
        a = a * a % c;
        b >>= 1;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //2008  --> 2^3 * 251
    while(cin >> n >> k && n && k){
        ll m = (qp(2,3*n+1,250*k)-1)*(qp(251,n+1,250*k)-1)%(250*k)/250;
        cout << qp(2008,m,k) << '\n';
    }
    return 0;
}

 

你可能感兴趣的:(HDU,数论)