SOJ 3578 欧拉函数

(a^b^c)%p   a,b,c都比较大时 用欧拉函数结合快速幂来做   

欧拉定理:
在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。
欧拉定理表明,若n,a为正整数,且n,a互素, (a,n) = 1,则   a^φ(n) ≡ 1 (mod n)
  其中φ(n)=nT(1-1/x)其中x是n的因子

费马小定理:
费马小定理是数论中的一个重要定理,其内容为:
假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1

A^B%C = A^(B%phi(C)+phi(C))%C

这题模数刚好是质数

 

#include<stdio.h>
#include<math.h>
#define Mod 317000011
int euler(int x)
{
    return x-1;
}

int ex(int a,int b,int mod)
{
    long long res=1;
    long long x=a;
    for(;b;b>>=1)
    {
      if(b&1)
      res=(res*x)%mod;
      x=(x*x)%mod;
    }
    return res;
}

int main()
{
    int t;
    scanf("%d",&t);
    int mod=euler(Mod);
    while(t--)
    {
      int a,b,c;
      scanf("%d%d%d",&a,&b,&c);
      int x=ex(b,c,mod);
      x+=mod;
      int y=ex(a,x,Mod);
      printf("%d\n",y);
    }
    return 0;
}


下面是求欧拉函数的模板

unsigned euler(unsigned x)
{// 就是公式
unsigned i, res=x;
for (i = 2; i < (int)sqrt(x * 1.0) + 1; i++)
if(x%i==0) {
res = res / i * (i - 1);
while (x % i == 0) x /= i; // 保证i一定是素数
}
if (x > 1) res = res / x * (x - 1);
return res;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值