XDOJ_1148_欧拉定理+快速幂

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XDOJ_1148_欧拉定理+快速幂相关的知识,希望对你有一定的参考价值。

http://acm.xidian.edu.cn/problem.php?id=1148

 

若a和y互质,可以简单的由PowerMod(a,PowerMod(b,c,euler(y)),y)得出。

但是存在a和y不互质的情况,于是就不知道怎么做了,PowerMod(a,PowerMod(b,c,euler(y)),y)*PowerMod(gcd(a,y),euler(y),y)%y)可以在前面的值比k小的时候用,虽然不知道怎么的出来的,前面的值比k小直接用快速幂算原来的就好了,至于这个范围也懒得算了,弄了一个肯定正确的范围。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;

LL a,b,c,y;

LL gcd(LL a,LL b)
{
    return b?gcd(b,a%b):a;
}

LL PowerMod(LL a, LL b, LL c)
{
    LL ans = 1;
    a = a % c;
    while(b)
    {
        if(b&1) ans = (ans*a)%c;
        b = b>>1;
        a = (a*a)%c;
    }
    return ans;
}

LL euler(LL n)
{
    LL res = n,a = n;
    for(LL i = 2;i*i <= a;i++)
    {
        if(a%i == 0)
        {
            res = res/i*(i-1);
            while(a%i == 0)    a /= i;
        }
    }
    if(a > 1)    res = res/a*(a-1);
    return res;
}

int main()
{
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&y))
    {
        if(log(b) < 9/c)
        {
            printf("%lld\n",PowerMod(a,PowerMod(b,c,1e9+7),y));
        }
        else    printf("%lld\n",PowerMod(a,PowerMod(b,c,euler(y)),y)*PowerMod(gcd(a,y),euler(y),y)%y);
    }
    return 0;
}

 

以上是关于XDOJ_1148_欧拉定理+快速幂的主要内容,如果未能解决你的问题,请参考以下文章

XDOJ_1145_矩阵快速幂

Exponial (欧拉定理+指数循环定理+欧拉函数+快速幂)

bzoj 1951: [Sdoi2010]古代猪文 中国剩余定理+欧拉定理+组合数学+卢卡斯定理

XDOJ_1182_快速乘

XMU 1615 刘备闯三国之三顾茅庐 欧拉函数+快速幂+欧拉定理

解题报告 (十五) 扩展欧拉定理