SOJ 3578 欧拉函数

来源:互联网 发布:修改linux账号权限 编辑:程序博客网 时间:2024/06/06 01:27

(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 317000011int 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;}