【C++心路历程23】求幂的和 分治算法

【问题描述】   题目很简单:请你计算(a^1+a^2+…+a^n) mod 1234567 的结果,其中(0 < a,n < 2^31 )。【输入格式】 第一行T,表示数据组数,接下来的T行,每行包含a和n,表示一组数据。【输出格式】 对于每组数据,输出对应的答案。【输入样例】 5 1 7 3 10 5 8 9 20 17 100【输出样例】 7 88572 488280
摘要由CSDN通过智能技术生成

【问题描述】

  题目很简单:请你计算(a^1+a^2+…+a^n) mod 1234567 的结果,其中(0 < a,n < 2^31 )。

【输入格式】

第一行T,表示数据组数,接下来的T行,每行包含a和n,表示一组数据。

【输出格式】

对于每组数据,输出对应的答案。

【输入样例】

5
1 7
3 10
5 8
9 20
17 100

【输出样例】

7
88572
488280
696766
550479

【数据范围】

0< T <=1000
【分析】
首先不难想到直接用二分快速幂求解,算出每个幂的值后相加。
时间复杂度分析:O(T*log2(n!))在本题n < 2^31,T <=1000不能通过全部数据。
其次能想到等比数列运用公式直接求解,但本题数据规模较大,且运用除法不能取模,所以得想想其他的方法— —
由a^1+a^2+…+a^n,如果将这个式子二分,得到(a^1+a^2+…+a^(n/2))*(1+a^(n/2));则本题就迎刃而解了,运用分治不断递归求解即可。
参考:


                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值