`

A^B%C

阅读更多
1.当a,b,c都很小的时(如a,b,c<1000000),可以直接暴力枚举。

int res=1;
for(int i=1;i<=b;i++)
{
    res=res*a%c;
}
cout<<res<<endl;


2.当a,b,c都较大时(如a,b,c<2000000000),可以使用反复平方法法求幂。

B=x0*20+x1*21+x2*22+x3*23+……+xn*2n
AB=A^( x0*20+x1*21+x2*22+x3*23+……+xn*2n) ,  xi∈{0,1}
resi= A^( x0*20+x1*21+x2*22+……+xi*2i);//初始化时res0=1
halfi=A^(2i);// 初始化时half0=A;
if(xi+1==0) resi+1= resi;
else resi+1=resi*halfi;

int res=1,half=a%c;
while(b)
{
   if(b&1)   res=res*half%c;
   half=half*half%c;
   b>>=1;
}//注意防止64位溢出,此时需要使用到模拟乘法来避免溢出

3.当b很大时,(如b<10^1000000),利用循环节及公式。

A^x = A^(x % Phi(C) + Phi(C)) (mod C),(要求:x>=phi(c))

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=1000010;
typedef __int64 lld;
char b[maxn];
lld a,c;
lld phi(int n)
{
    lld res=n,i;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)  res=res/i*(i-1);
        while(n%i==0)   n/=i;
    }
    if(n>1) res=res/n*(n-1);
    return res;
}
lld pow_mod(lld a,lld n,lld p)
{
    lld res=1,half=a%p;
    while(n)
    {
        if(n&1)     res=res*half%p;
        half=half*half%p;
        n>>=1;
    }
    return res;
}
int main()
{
    while(scanf("%I64d%s%I64d",&a,b,&c)==3)
    {
        lld len=strlen(b);
        if(len<11)
        {
            lld B=0;
            for(lld i=0;i<len;i++)
            {
                B=B*10+b[i]-'0';
            }
            printf("%I64d\n",pow_mod(a,B,c));
            continue;
        }
        //求phi(c)
        lld p=phi(c);
        //求b%phi(c)
        lld k=0;
        for(int i=0;i<len;i++)
        {
            k=(k*10+b[i]-'0')%p;
        }
        printf("%I64d\n",pow_mod(a,k+p,c));
    }
    return 0;
}




若干其他循环节
分享到:
评论

相关推荐

    求 a^b%c的大小

    求a^b%c Description Now you are given three positive integers a , b and c,please calculate a^b % c; Input The input contains a single test case,The first line contains three integers a , b and c (0 ...

    a^b mod n 模乘运算

    RSA算法中求模乘运算的结果 ... int a b c; a x;b r;c t; if b 0 如果b为零 则结果等于1 { printf &quot;%d&quot; c ; 输出结果 return; } if b&gt;0 &amp;&amp; b%2 0 b为偶数 { b b 2; a a a %p; }

    ElGamal算法原理与实现_密码学源代码_C语言程序_C++程序源代码

    - 接着,接收者用k计算C2 * b^k % p = (m * a^k) * (g^x)^k % p = m * (g^(kx)) % p = m * a^k % p / a^k % p = m % p,从而得到明文m。 **ElGamal算法的优缺点:** - 优点:安全性基于困难的离散对数问题,理论...

    RSA加密(快速幂求余).pdf

    RSA 加密是基于快速幂求余算法的,用于计算 `a^b % c`,其中 `a`、`b` 和 `c` 是三个正整数。快速幂求余算法的核心是利用二进制表示法来快速计算 `a^b`,然后再进行模运算以获取余数。 快速幂求余算法的优点是可以...

    a^b-mod-c.rar_MOD

    描述中提到的问题是要求解 `a^b mod c`,其中 `a`、`b` 和 `c` 都是整数,并且满足 `a &gt;= 0`, `b &gt;= 0`, `c &gt; 1`。这个问题通常是编程竞赛或算法设计中的常见题目,它涉及到高效计算大整数的指数模运算。 模运算...

    速幂算法C语言版(超详细).

    原始的快速幂算法可以用以下公式表示:ans = a^b % c,其中a是底数,b是指数,c是模数。这个算法的时间复杂度为 O(b),当b很大时,计算效率很低。 知识点3:快速幂算法的优化 为了提高计算效率,可以使用以下公式:...

    汇编语言和c语言矩阵A*B+C*D的运算

    汇编语言和C语言矩阵A*B+C*D的运算是一种常见的矩阵运算,用于实现矩阵的乘法和加法。本文将从两个方面对其进行讲解:C语言实现和汇编语言实现。 C语言实现: 在C语言中,实现矩阵A*B+C*D的运算可以使用以下步骤:...

    C++快速幂与大数取模算法示例

    在C++中,当需要计算`a^b`模`p`时,传统方法会进行b次乘法操作,时间复杂度为O(b)。快速幂通过分治策略将时间复杂度降低到O(log b)。 基本思路是利用幂的二进制表示,将`b`表示为二进制形式,如`b = b1 * 2^k + b0`...

    C程序设计教程2004上半年C语言考试题

    1. **常量与数据类型**:C语言中的整型常量可以是十进制、八进制或十六进制表示,例如选择题第一题,选项A、B、D分别代表十进制、十进制和八进制的整数,而选项C的789,000不符合C语言整型常量的格式,因为逗号不是...

    第六届蓝桥杯软件大赛A组预赛

    方程: a^2 + b^2 + c^2 = 1000 (或参见【图1.jpg】) 这个方程有整数解吗?有:a,b,c=6,8,30 就是一组解。 你能算出另一组合适的解吗? a,b,c=10,18,24 请填写该解中最小的数字。 注意:你提交的应该是一个整数,...

    a+b c语言

    根据给定的文件标题“a+b c语言”以及描述“A+B的c语言表示方法.很简单的一个例子仅供参考”,我们可以总结出以下关键知识点: ### C语言基础知识 C语言是一种广泛使用的编程语言,它支持过程化编程、静态类型、...

    完美立方数,c语言简易练习题

    /*形如a^3=b^3+c^3+d^3的等式被称为完美立方等式 例如12^3=6^3+8^3+10^3.编写一个程序对任给的正整数N《=100寻找所有的四元组( a,b,c,d)使得abcd满足等式 其中abcd在1—100之间且b&lt;=c 输入一个正整数N 每行输出一个...

    高等数学,常用积分公式

    8. \( \int \frac{2x^2}{(ax^b + c)^2} dx = \frac{-2}{3b} \ln|ax^b + c| + \frac{2c}{3b^2(a^2 - c^2)} \ln\left|\frac{ax^b - c}{ax^b + c}\right| - \frac{2c^3}{3b^3(a^2 - c^2)^2} \ln\left|\frac{ax^b - c}{...

    formulaj:FormulaJ 是一个用于计算数学表达式的多线程 Java 库。 它支持 +、-、*、^ 和 % 运算符、布尔表达式、短表达式格式 (2x + 3y) 和变量。 它包括一个带有 20 个数学函数的标准库,可以委托未知的函数或符号。 用户可以轻松创建和使用自己的自定义功能

    公式J它是什么? FormulaJ 是一个用于计算数学表达式的多线程 Java 库。... 例如,c = a * b如何使用它?Maven 存储库请参阅用法表达式构建器。 newMath[removed]"a * b") .withVariable("a", Decimal.f

    C语言程序设计-给出百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80~89分为B,7

    C语言程序设计-给出百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E(使用switch语句)。

    A+B.c A+B的C语言示范程序

    A+B的C语言示范程序

    取模运算和取余运算.pdf

    4. 传递性:若a ≡ b (mod p)且b ≡ c (mod p),则a ≡ c (mod p)。 模运算还遵循类似四则运算的规则,例如: 1. (a + b) % p = (a % p + b % p) % p。 2. (a - b) % p = (a % p - b % p) % p。 3. (a * b) % p = ...

    c语言二分法递归求解函数根

    1. 计算中间点c = (a + b) / 2。 2. 如果f(c) = 0,那么c就是方程的根。 3. 如果f(a) * f(c) ,说明根在[a, c]之间,更新区间为[a, c]。 4. 如果f(b) * f(c) ,说明根在[c, b]之间,更新区间为[c, b]。 5. 重复上述...

    计算a*b的乘法c语言

    计算a*b的乘法c语言,设a 和b的值然后计算a*b,最后写出结果

    汉诺塔C语言实现

    传说中,印度的一个寺庙里有一组梵塔,由三个塔座(A、B、C)组成,其中A座上放着64个大小不同的金盘,按照大盘在下、小盘在上的顺序排列。寺庙中的和尚们被赋予了一个任务:将这些盘子全部从A座移到C座,但必须遵循...

Global site tag (gtag.js) - Google Analytics