Super A^B mod C(快速幂+欧拉降幂)

Super A^B mod C

欧拉降幂模板题:

欧拉公式:

img

欧拉函数:

ll phi(ll x)//欧拉函数
{
	ll i;
	ll num = x;
	for(i = 2; i*i <= x; i++)
	{
		if(x % i == 0)
		{
			num = (num/i)*(i-1);
			while(x % i == 0)
			{
				x = x / i;
			}
		}
	}
	if(x != 1) num = (num/x)*(x-1);
	return num;
}

大数求余(同余模定理)

同余模定理

(a + b)%c = (a%c + b%c) % c;

(a * b)%c = (a%c * b%c) % c;

举例:

m=1234,模n

就等于 ((((110)%n+2%n)%n * 10%n+3%n)%n10%n+4%n)%n

板子:

ll big_mod(string big_num, ll _mod)
{
    ll num = 0;
    for(int i=0; i<big_num.size(); i++)//大数取模 同余模定理
	{
		num=(num*10 + (int)(big_num[i]-'0')) % _mod;
	}
    
    return num;
}

题解:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<iomanip>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
#define mod 998244353
#define INF 0x3f3f3f3f
const int MAX = 1e5 + 10;
using namespace std;

ll big_mod(string big_num, ll _mod)
{
    ll num = 0;
    
    for(int i=0; i<big_num.size(); i++)//大数取模 同余模定理
	{
		num=(num*10 + (int)(big_num[i]-'0')) % _mod;
	}
    
    return num;
}

ll phi(ll x)//欧拉函数
{
	ll i;
	ll num = x;

	for(i = 2; i*i <= x; i++)
	{
		if(x % i == 0)
		{
			num = (num/i)*(i-1);

			while(x % i == 0)
			{
				x = x / i;
			}
		}
	}

	if(x != 1) 
    num = (num/x)*(x-1);

	return num;
}


long long power(long long a,long long b,long long c)//快速幂
{
	long long base=a,sum=1;

	while(b!=0)
	{
		if(b&1)
		sum=(sum*base) %c ;

		base=(base*base) % c;

		b>>=1;
	}

	return sum%c;
}


int main(void)
{
    ll a,c;
    string b;
    
    while(cin>>a>>b>>c)
    {
        ll PHI = phi(c);
        ll B = big_mod(b, PHI);

        cout<<power(a, B, c)<<endl;
    }

}
发布了10 篇原创文章 · 获赞 1 · 访问量 158

猜你喜欢

转载自blog.csdn.net/weixin_45701902/article/details/105323418