FUZ 1759 Super A^B mod C (指数循环节/模板)

题意:求A^B mod C,其中(1<=A,C<=1000000000,1<=B<=10^1000000).

思路:

在有些题目中我们需要对指数进行降幂处理才能计算。比如计算

其中

这里由于很大,所以需要进行降幂。那么实际上有如下降幂公式

有了上述公式,很多题目就可以迎刃而解了。

摘自ACdreamer博客

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N=1000005;
typedef long long ll;

char str[N];

int phi(int 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;
}

ll multi(ll a,ll b,ll m)
{
    ll ans = 0;
    a %= m;
    while(b)
    {
        if(b & 1)
        {
            ans = (ans + a) % m;
            b--;
        }
        b >>= 1;
        a = (a + a) % m;
    }
    return ans;
}

ll quick_mod(ll a,ll b,ll m)
{
    ll ans = 1;
    a %= m;
    while(b)
    {
        if(b & 1)
        {
            ans = multi(ans,a,m);
            b--;
        }
        b >>= 1;
        a = multi(a,a,m);
    }
    return ans;
}

void Solve(ll a,char str[],ll c)
{
    ll len = strlen(str);
    ll ans = 0;
    ll p = phi(c);
    if(len <= 15)
    {
        for(int i=0; i<len; i++)
            ans = ans * 10 + str[i] - ‘0‘;
    }
    else
    {
        for(int i=0; i<len; i++)
        {
            ans = ans * 10 + str[i] - ‘0‘;
            ans %= p;
        }
        ans += p;
    }
    printf("%I64d\n",quick_mod(a,ans,c));
}

int main()
{
    ll a,c;
    while(~scanf("%I64d%s%I64d",&a,str,&c))
        Solve(a,str,c);
    return 0;
}
时间: 2024-12-07 15:35:30

FUZ 1759 Super A^B mod C (指数循环节/模板)的相关文章

FZU - 1759 Super A^B mod C 降幂公式

知道降幂公式这题就很好办了 B>=Phi(c)的时候可以降幂然后快速幂计算,否则就直接快速幂计算. 这里的大数对小数取模直接利用取模性质按位取就行了. //A^B %C=A^( B%phi(C)+phi(C) ) %C #include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include<string> #include<cmath&g

Brute-force Algorithm HDU - 3221(指数循环节 矩阵快速幂)

水题一道 推一下就是 f[n] = f[n - 1] + f[n - 2] 发现n很大 所以用矩阵快速幂就好了 还有P很大  那就指数循环节 一定要注意   这个条件 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #incl

hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂

Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description QSC dream of becoming a mathematician, he believes that everything in this world has a mathematical law. Through unremitting e

斐波那契数列寻找mod n 循环节 模板

该代码来自ACdreamer 1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stdio.h> 5 #include <math.h> 6 7 using namespace std; 8 typedef unsigned long long LL; 9 10 const int M = 2; 11 12 struct Matrix 13

HDU2837 Calculation(指数循环节)题解

题意: 已知\(f(0)=1,f(n)=(n\%10)^{f(n/10)}\),求\(f(n)\mod m\) 思路: 由扩展欧拉定理可知:当\(b>=m\)时,\(a^b\equiv a^{b\%\varphi(m)+\varphi(m)}\mod m\),那么我们可以通过这个式子直接去递归求解. 在递归的时候每次给下一个的模数都是\(phi(mod)\),那么我们求出来之后,怎么知道要不要再加\(phi(m)\)? 给出一个判定方法,若\(a^b>=m\),那么需要改为\(a^{b+phi

指数循环节&amp;欧拉降幂

证明:https://www.cnblogs.com/maijing/p/5046628.html 注意使用条件(B的范围) 例题: FZU1759 HDU2837 ZOJ1674 HDU4335 原文地址:https://www.cnblogs.com/fzl194/p/9074348.html

Super A^B mod C

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space. Out

FZU-1759 Super A^B mod C---欧拉降幂&amp;指数循环节

题目链接: https://cn.vjudge.net/problem/FZU-1759 题目大意: 求A^B%C 解题思路: 注意,这里long long需要用%I64读入,不能用%lld 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 typedef long long ll; 7 const in

Super A^B mod C 快速幂+欧拉函数降幂

uper A^B mod C Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are