计蒜客-Exponial(欧拉降幂)

题目:https://nanti.jisuanke.com/t/17414

题意:给出一个n(1~1e9),m(1~1e9),求exponial(n)%m的值

思路:欧拉降幂

注意n<= 4的时候的特判,因为我们没法直接判出B是否小于phi(C),因为递归得来的B已经是模phi(phi(C))的结果.

欧拉函数:对一个正整数N,欧拉函数是小于N且与N互质的数的个数.

例如φ(24)=8,因为1, 5, 7, 11, 13, 17, 19, 23均和 24 互质.

 φ(n) = n*(1-\frac{1}{p1})*(1-\frac{1}{p2})*....*(1-\frac{1}{pn})  其中(p1.....pn)为N的素因子.

 φ(24)=24*(1-\frac{1}{2})*(1-\frac{1}{3})=8.

 

代码:

#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 2e5+5;

ll a[6] = {0,1,2,9,262144};

ll quick_pow(ll x,ll y,ll mod)
{
	ll ans = 1;
	while(y)
	{
		if(y&1)
			ans = ans*x%mod;
		y>>= 1;
		x = x*x%mod;
	}
	return ans;
}

ll euler(ll x)
{
	ll ans = x;
	for(int i = 2;i*i<= x;i++)
	{
		if(x%i == 0)
		{
			ans-= ans/i;
			while(x%i == 0) x/= i;
		}
	}
	
	if(x> 1) ans-= ans/x;
	return ans;
}

ll dfs(ll n,ll m)
{
	if(m == 1) return 1;
	if(n<= 4)
	{
		if(a[n]>= m) return a[n]%m+m;
		return a[n]%m;
	}
	ll mod = euler(m);
	ll ans = dfs(n-1,mod);
	
	return quick_pow(n,ans,m)+m;
}

int main()
{
	ll n,m;
	cin>>n>>m;
	
	ll tmp = dfs(n-1,euler(m));
	tmp = quick_pow(n,tmp,m);
	cout<

 

你可能感兴趣的:(数论相关)