Sum(欧拉降幂+快速幂)

本文介绍了一种利用欧拉降幂算法优化大数运算的方法,特别适用于求解2的n-1次方的问题,当n的值非常大时,直接计算变得不可行。通过使用欧拉定理,可以将指数降低到一个更小的范围,从而显著减少计算复杂度。文章提供了一个C++实现示例,包括快速幂运算、欧拉函数计算以及如何将这些应用到大数运算中。

Input

2

Output

2

        
 

Hint

1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.

Sample Input

2

Sample Output

2

        
  

Hint

1.  For N = 2, S(1) = S(2) = 1.

2.  The input file consists of multiple test cases. 

        
 归律是2的n-1次方但是n太大就用到了欧拉降幂

和之前的一道题很想,之前的是2的n次方https://blog.youkuaiyun.com/lbperfect123/article/details/86693581

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>

const int maxn=1e5+5;
const int mod=1e9+7;
typedef long long ll;
using namespace std;

char a[100005];
ll x,z=mod;
ll quickpow(ll x,ll y,ll z)
{
    ll ans=1;
    while(y)
    {
        if(y&1)
            ans=ans*x%z;
        x=x*x%z;
        y>>=1;
    }
    return ans;
}
ll phi(ll n)
{
    ll i,rea=n;
    for(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()
{
    while(scanf("%s",a)!=EOF)
    {
        ll len=strlen(a);
        ll p=phi(z);
        ll ans=0;
        for(ll i=0;i<len;i++)
            ans=(ans*10+a[i]-'0')%p;
        ans+=p;
        printf("%lld\n",quickpow(2,ans-1,z));
    }
    return 0;
}
 

 

### 计算斐波那契数列的幂和并取模 要实现 $\sum_{i=1}^{n}(fib(i)^k) \mod m$ 的计算,可以通过以下几个方面来完成: #### 1. **利用矩阵快速幂加速斐波那契数列的计算** 对于大范围的 $n$ 和高次幂 $k$,直接逐项计算可能会非常耗时。因此可以采用矩阵快速幂的方法高效求解斐波那契数列。 斐波那契数列可以用如下矩阵形式表示: $$ \begin{bmatrix} F(n+1) \\ F(n) \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^n \times \begin{bmatrix} 1 \\ 0 \end{bmatrix}. $$ 通过矩阵快速幂可以在 $O(\log n)$ 时间复杂度内计算任意第 $n$ 项斐波那契数[^3]。 #### 2. **处理幂运算与取模操作** 由于题目涉及的是 $(fib(i))^k \mod m$,可以直接应用费马小定理或者欧拉定理简化幂运算过程。如果 $m$ 是质数,则有: $$ a^p \equiv a \ (\text{mod}\ p), $$ 即当指数过大时,可以通过降幂的方式减少计算量。 另外,在实际编码过程中应始终注意中间结果可能溢出的问题,所以每一步都需要及时对 $m$ 取模以保持数值大小可控。 以下是基于以上理论的一个 Python 实现方案: ```python def matrix_mult(A, B, mod): """矩阵乘法""" C = [[0, 0], [0, 0]] for i in range(2): for j in range(2): for k in range(2): C[i][j] = (C[i][j] + A[i][k]*B[k][j]) % mod return C def matrix_pow(M, power, mod): """矩阵快速幂""" result = [[1, 0], [0, 1]] # 单位矩阵 base = M[:] while power > 0: if power % 2 == 1: result = matrix_mult(result, base, mod) base = matrix_mult(base, base, mod) power //= 2 return result def fibonacci_mod(n, mod): """计算第n个斐波那契数并对mod取余""" if n == 0: return 0 elif n == 1: return 1 M = [[1, 1], [1, 0]] res_matrix = matrix_pow(M, n-1, mod) return res_matrix[0][0] def fast_power(a, b, mod): """快速幂算法""" ret = 1 while b > 0: if b % 2 == 1: ret = (ret * a) % mod a = (a * a) % mod b //= 2 return ret def sum_fib_powers(n, k, m): total_sum = 0 for i in range(1, n+1): fib_i = fibonacci_mod(i, m) powered_value = fast_power(fib_i, k, m) total_sum = (total_sum + powered_value) % m return total_sum # 测试函数调用 print(sum_fib_powers(10, 2, 10)) # 输出测试结果 ``` 此程序实现了从头至尾完整的逻辑链条——先定义辅助工具(如矩阵相乘、矩阵快速幂),再封装核心功能模块用于单独获取某一项斐波那契值及其对应幂次的结果;最后累加这些部分贡献得出最终答案。 --- ### 性能分析 该方法的时间复杂度主要取决于两部分:一是矩阵快速幂所需时间约为 $O(\log n)$,二是外层循环遍历每一项斐波那契数列成员所花费的成本为线性的 $O(n)$。综合来看整体效率较高,适合解决中小规模输入下的问题实例。 然而针对极端情况 ($n,k,m$ 都极大),仍需进一步优化策略比如预处理周期性规律等手段降低冗余重复劳动强度。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black-hole6

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值