E - Exponial Gym - 101550E——(欧拉降幂)

ab =
       ① ab ,b< p
       ②ab%∮( p )+∮( p ), b >= p

题目链接

本题利用知识点:

欧拉降幂(指数>= Mod 的情况)
快速幂
递归

#include<iostream>
#include<cstdlib>
#include<cstdio>
#define ll long long
using namespace std;
ll qpow(ll a, ll n, ll Mod)
{
    ll ret = 1;
    while(n)
    {
        if(n%2)ret = ret*a%Mod;
        a = a*a%Mod;
        n/=2;
    }

    return ret;
}
ll phi(ll p)
{

    ll ret = p;
    for( ll i = 2; i*i <= p; i++)
    {
        if(p %i == 0)
        {
            ret = ret*(i-1)/i;
            while(p%i == 0)p/=i;
        }
    }
    if(p > 1)ret = ret*(p-1)/p;
    return ret;
}

ll solve(ll a, ll Mod)
{
    if(Mod == 1)return 0;// 剪枝部分  任何数对1取模为 0

    if(a == 1)return 1%Mod;/*   */
    if(a == 2)return 2%Mod;/*   */
    if(a == 3)return 9%Mod;/******/
    if(a == 4)return qpow(4ll, 9ll, Mod);/******因为只是利用欧拉降幂 指数 >= Mod的情况, 根据题意Mod<= 1e9  所以在a == 1~4情况, 降幂公式可能失效******/


    ll ph = phi(Mod);
    return qpow(a, ph+solve(a-1,ph), Mod);//   利用欧拉降幂指数 大于 >= Mod的情况, 并且根据题意 进行可以进行递归递归
}
int main()
{
    ll n, p;
    while( cin>>n>>p)
    {
        cout<< solve(n, p)<<endl;
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值