欧拉定理及扩展

欧拉定理:对于任意互素的a和n,有 a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1(mod n) aφ(n)1(modn)
证明:
记小于n且与n互素的数为 R = { x 1 , x 2 . . . x φ ( n ) x_1,x_2...x_\varphi(n) x1,x2...xφ(n)}
令S = { a x 1 % n , a x 2 % n , ⋯   , a x φ ( n ) % n } \{ax_1\%n,ax_2\%n,\cdots,ax_{\varphi(n)}\%n\} {ax1%n,ax2%n,,axφ(n)%n}

∀ i ∈ [ 1 , φ ( n ) ] \forall i\in[1,\varphi(n)] i[1,φ(n)]
∵ ( a , n ) = 1 , ( x i , n ) = 1 \because (a,n)=1,(x_i,n)=1 (a,n)=1,(xi,n)=1
∴ ( a x i , n ) = 1 \therefore (ax_i,n)=1 (axi,n)=1
由 最 大 公 约 数 的 性 质 可 得 ( a x i % n , n ) = 1 由最大公约数的性质可得(ax_i\%n,n)=1 (axi%n,n)=1
所 以 S 中 所 有 元 素 都 与 n 互 质 , 且 都 小 于 n 。 所以 S 中所有元素都与 n 互质,且都小于 n。 Snn

∵ x 1 % n = x 1 , x 2 % n = x 2 , ⋯   , 且 a % n 为 定 值 \because x_1\%n = x_1,x_2\%n = x_2,\cdots,且a\%n为定值 x1%n=x1,x2%n=x2,,a%n
∴ S 中 无 重 复 元 素 \therefore S 中无重复元素 S
∴ S = R \therefore S=R S=R

∴ ∏ i = 1 φ ( n ) a x i % n = ∏ i = 1 φ ( n ) x i \therefore\prod_{i=1}^{\varphi(n)}ax_i\%n=\prod_{i=1}^{\varphi(n)}x_i i=1φ(n)axi%n=i=1φ(n)xi
∴ ∏ i = 1 φ ( n ) a x i ≡ ∏ i = 1 φ ( n ) x i ( m o d    n ) ⟹ \therefore\prod_{i=1}^{\varphi(n)}ax_i\equiv\prod_{i=1}^{\varphi(n)}x_i(\mod n)\Longrightarrow i=1φ(n)axii=1φ(n)xi(modn) a φ ( n ) ∏ i = 1 φ ( n ) x i ≡ ∏ i = 1 φ ( n ) x i ( m o d    n ) a^{\varphi(n)}\prod_{i=1}^{\varphi(n)}x_i\equiv\prod_{i=1}^{\varphi(n)}x_i(\mod n) aφ(n)i=1φ(n)xii=1φ(n)xi(modn)
又 ( ∏ i = 1 φ ( n ) x i , n ) = 1 又(\prod_{i=1}^{\varphi(n)}x_i,n)=1 (i=1φ(n)xi,n)=1
故 a φ ( n ) ≡ 1 ( m o d    n ) 故a^{\varphi(n)}\equiv1(\mod n) aφ(n)1(modn)

扩展欧拉定理(也是常说的欧拉降幂)
对于任意的a,b,m, 若 b > = φ ( m ) 若b >=\varphi(m) b>=φ(m) a b ≡ a b m o d    φ ( m ) + φ ( m ) ( m o d   m ) a^b \equiv a^{b \mod \varphi(m) + \varphi(m)}(mod\ m) ababmodφ(m)+φ(m)(mod m)

求a ^ a ^ a ^ a ^ … ^ a % c,一共b个a

#include <cstdio>
typedef long long ll;

ll euler(ll n)    //计算模数的欧拉函数 
{
	ll res = n,a = n;
	for (int i = 2; i * i <= n; i++)
	{
		if( a % i == 0 )
		{
			res -= res / i;
			while( a % i == 0 ) a /= i;
		}
	}
	if( a > 1 ) res -= res / a;
	return res;
}

ll q_pow(ll a,ll b,ll mod)    //快速幂 
{
	ll ans = 1;
	int flag = 0;
	while( b )
	{
		if( b & 1 ) 
		{
			ans *= a;
			if( ans > mod ) flag = 1;
			ans %= mod;
		}
		a *= a;
		if( a > mod ) flag = 1;
		a %= mod;
		b >>= 1;
	}
	return ans + flag * mod;   
	//不能简单的返回%mod的值,大于mod时要加mod(欧拉定理的约束) 
}

ll cal(ll a,ll l,ll r,ll mod)
{
	if( mod == 1 ) return 1;   //模数为1时直接返回1回溯,因为后面等于多少到这一层%1都等于0 
	if( l == r )      //递归到最后,回溯 
	{
		if( a > mod ) a = a % mod + mod;
		return a;
	}
	ll b = cal(a,l+1,r,euler(mod));  //计算下一层的指数(注意模数变为当前值的欧拉值) 
	return q_pow(a,b,mod);    //快速幂计算 
}

int main()
{
	int t;
	scanf("%d",&t);
	while( t-- )
	{
		ll a,b,c;
		ll ans;
		scanf("%lld%lld%lld",&a,&b,&c);
		if( b == 0 ) ans = 1;
		else if( b == 1 ) ans = a;
		else ans = cal(a,1,b,c);
		ans %= c;
		printf("%lld\n",ans);
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值