欧拉降幂

 

 

 

 对于b很大这种情况,请使用欧拉降幂

首先介绍一下欧拉函数(此处用到一些网络资料)

同余符号
含义
两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余
记作a≡b(mod m)
读作a同余于b模m,或读作a与b关于模m同余。
比如26≡14(mod 12)。

 

复制代码
ll ol(ll n)
{
    int rea=n;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            rea=rea-rea/i;
            while(n%i==0)
            n/=i;
        }
    }
    if(n>1)
      rea=rea-rea/n;
    return rea;
}
int main()
{
    ll a,b,c;
    cin>>a;
    cout<<ol(a)<<endl; 
} 
复制代码

可得知该数范围内与这个数互质数的个数

欧拉降幂公式

 

 由于我太弱这里不做证明

 

 上解题代码

 

复制代码
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
typedef long long ll;
using namespace std;
bool note;
ll ol(ll n)
{
    ll rea=n;
    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            rea=rea*(i-1)/i;
            while(n%i==0)
            n/=i;
        }
    }
    if(n>1) rea=rea*(n-1)/n;
    return rea;
}
ll jc(string bb,ll mod)
{
    ll ans=0;
    for(ll i=0;i<bb.size();i++)
    {
        ans=ans*10+(bb[i]-'0');
        if(ans>=mod)
        {
            ans%=mod;note=1;
        }
    }
    return ans;
}
ll km(ll a,ll b,ll c)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=(res*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return res;
}
int main()
{
    int sum;cin>>sum;
    while(sum--)
    {
       note=0;
       ll a,c;
       string b;
       cin>>a>>b>>c;
       ll cmod=ol(c);
       ll bb=jc(b,cmod);
       if(__gcd(a,c)!=1&&note) bb+=cmod;
       cout<<km(a,bb,c)<<endl;
    }
    return 0;
} 
复制代码

等我啥时候懂了再来补降幂证明(

posted on   zesure  阅读(213)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示