您的位置:首页 > 其它

HDU 5728 - PowMod

2016-07-24 22:41 267 查看
HDU 5728 - PowMod

题意:
定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007

给出: n,m,p ,且 n 无平方因子

求: ans= k^(k^(k...k)) mod p (k有无限个)

分析:

欧拉函数 + 指数循环节

第一部分 求出 k.
  定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
  应用:
  ∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) ,可自行推导
第二部分
  应用指数循环节化无限为有限,具体实现为递归操作

  指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C))

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MOD= 1000000007;
const int MAXN=1e7;
int euler[MAXN+5];
long long sum[MAXN+5];
long long k,n,m,p;
void GetEuler()
{
memset(euler,0,sizeof(euler));
euler[1]=1;
for(int i = 2;i <= MAXN;i++)
if(!euler[i])
for(int j = i;j <= MAXN;j += i)
{
if(!euler[j]) euler[j]=j;
euler[j] = euler[j] / i * (i-1);
}
sum[1]=1;
for(int i = 2;i <=MAXN; i++)
sum[i] = (sum[i-1] + euler[i]) % MOD;
}
long long Get_K(long long n,long long m)
{
if(m==0) return 0;
if(m==1) return euler
;
if(n==1) return sum[m];
if(euler
==n-1) return (euler
*Get_K(1,m)%MOD + Get_K(n,m/n))%MOD;
for(int i=2;i<MAXN;i++)
if(n%i==0)
return (euler[i] * Get_K(n/i,m)%MOD + Get_K(n,m/i) ) % MOD;
}
long long PowMod(long long a,long long b, long long mod)
{
long long r = 1;
while(b)
{
if(b&1) r = (r*a)%mod;
a= (a*a)%mod;
b>>=1;
}
return r;
}
long long Cal(long long k, long long p)
{
if( p == 2) return k&1;//mod φ(p)
return PowMod(k,Cal(k,euler[p])+euler[p],p);//递归的计算ans,递归出口为φ(p)=1
}
int main()
{
GetEuler();
while(~scanf("%lld%lld%lld",&n,&m,&p))
{
k = Get_K(n,m);
printf("%lld\n",Cal(k,p));
}
}


/*
欧拉函数:
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。   例如euler(8)=4,因为1,3,5,7均和8互质。

通式:
对于一个正整数N的素数幂分解    N = (P1^q1) * (P2^q2) * ...* (Pn^qn).
φ(1) = 1.
φ(N) = N * (1-1/P1) * (1-1/P2) *...* (1-1/Pn).

定理:
1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.

2.一个数的所有质因子之和是  euler(n)*n/2.

3.若n是素数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质.

特殊性质:
1.当n为奇数时,φ(2n) = φ(n).
2.对于质数p,φ(p) = p - 1
3.除了N=2,φ(N)都是偶数.

指数循环节:
A^x = A^(x % φ(C) + φ(C)) (mod C)  (x >= φ(C))

定理1 应用:
∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: