【二分】求幂的和
2016-07-29 09:15
274 查看
【问题描述】
题目很简单:请你计算(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
题目大意:求(a^1+a^2+…+a^n) mod 1234567 的结果;
由于指数n可以达到2^31,规模很大,所以需要用快速幂求解a^n,而本题除了求解a^n之外还需要求解a^1+a^2+…+a^n,这里有两种方法。
一:暴力求出a^1,a^2…a^n然后累加。时间复杂度O(nlog2n);
二:继续对和二分,设tmp=a^1+a^2+…+a^(n/2),
则最后的和sum=tmp+tmp*a^(n/2)(n为偶数)
或者sum=tmp+tmp*a^(n/2)+a^n(n为奇数)
而a^n,a^(n/2)都可以用快速幂求解。
这种算法的时间复杂度O(log2n*log2n)
注意:本题指数是从1开始的,故递归出口应是b==1时return a;
题目很简单:请你计算(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
题目大意:求(a^1+a^2+…+a^n) mod 1234567 的结果;
由于指数n可以达到2^31,规模很大,所以需要用快速幂求解a^n,而本题除了求解a^n之外还需要求解a^1+a^2+…+a^n,这里有两种方法。
一:暴力求出a^1,a^2…a^n然后累加。时间复杂度O(nlog2n);
二:继续对和二分,设tmp=a^1+a^2+…+a^(n/2),
则最后的和sum=tmp+tmp*a^(n/2)(n为偶数)
或者sum=tmp+tmp*a^(n/2)+a^n(n为奇数)
而a^n,a^(n/2)都可以用快速幂求解。
这种算法的时间复杂度O(log2n*log2n)
注意:本题指数是从1开始的,故递归出口应是b==1时return a;
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<cstring> #include<cmath> #include<cstdlib> #define mo 1234567 using namespace std; typedef long long LL; int T; int a,n; LL qkpw(int a,int b,int k)//求a^n%k { LL ans=1,t=a; while(b>0) { if(b&1)ans=ans*t%k; t=t*t%k; b=b/2; } return ans; } LL solve(int a,int b,int k)//求(a+a^2+a^3+...+a^n)%k { if(b==1)return a; LL tmp=solve(a,b/2,k); LL S; if(b&1)S=((tmp%k+qkpw(a,b/2,k)*tmp%k)%k+qkpw(a,b,k))%k; else S=(tmp%k+qkpw(a,b/2,k)*tmp%k)%k; return S; } int main() { //freopen("my.in","r",stdin); //freopen("my.out","w",stdout); scanf("%d",&T); while(T--) { scanf("%d%d",&a,&n); LL ans=solve(a,n,mo); cout<<ans<<endl; } return 0; }
相关文章推荐
- 二分求幂,快速求解a的b次幂
- 二分求幂(一种快速幂运算的方法)
- 九度oj1443 矩阵乘法加二分求幂
- hdu 1005 Number Sequence(矩阵连乘+二分快速求幂)
- 二分求幂 1
- 常规求幂、二分求幂、快速位求幂
- C - !সহজ ~কঠিন -- (二分求幂)
- 二分求幂(pow的logn算法)
- Code Lock(并查集加二分求幂)
- HDU-3461 Code Lock 并查集 + 二分求幂
- 算法 二分求幂(快速取幂)
- 题目1441:人见人爱 A ^ B(二分求幂)
- HDOJ 2035 人见人爱A^B-----二分快速求幂
- 复试训练——数学问题—— 二分求幂
- 二分求幂
- POJ 1845 Sumdiv 求幂级数的因子和+二分
- 计算几何-二分求幂
- hdu 3461 Code Lock(并查集+二分求幂)
- //九度OJ 教程59 矩阵二分求幂法之大幂
- 题目1442:A sequence of numbers(数列计算以及二分求幂运用)