标签:
给出两个整数A和N,计算(A + A^2 + A^3 + …… + A^(N - 1) + A^N)% 666666。
2 5 10 20
62 110
解题思路:对于求解A+A2+A3+A4+A5+An/2+A(n/2+1)...+An。
我们总可以化成:当n%2==1,(A1+A2+A3...+An/2)+An/2*(A1+A2+A3+...An/2)+An。
即(A1+A2+A3...+An/2)*(An/2+1)+An。
当n%2==0,(A1+A2+A3...+An/2)+An/2*(A1+A2+A3+...An/2)。
即(A1+A2+A3...+An/2)*(An/2+1)。
然后就可以分治求解。
#include<bits/stdc++.h> using namespace std; #define LL long long const LL mod=666666; LL Pow(LL a,LL x){ //快速幂 LL ret=1; while(x){ if(x&1) ret=ret*a%mod; a=a*a%mod; x>>=1; } return ret; } LL calcu(LL a,LL n){ //分治 if(n==1) return a; LL ret=calcu(a,n/2);//分治部分的返回值 ret=ret*(1+Pow(a,n/2))%mod; if(n%2==1) //n如果为奇数需再加上a^n ret= (ret+Pow(a,n))%mod; return ret; } int main(){ LL a,n; while(scanf("%lld%lld",&a,&n)!=EOF){ LL ans= calcu(a%mod,n); printf("%lld\n",ans); } return 0; }
nyoj 1197——你会加吗?——————【快速幂、分治】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4477191.html