@comzyh
2013-12-23T19:21:08.000000Z
字数 1584
阅读 2529
常见问题:给定整数M,等比数列
求其前n项和对M的模
朴素的想法,我们可以用等比数列求和公式
这里介绍另一种思路,就是使用二分的思想,很像矩阵快速幂
首先,我们先讨论一个简单的问题:
求
提取公因式,我们能把原式变为
进一步变换为
我们把这种等比数列前
这是二分法的关键,也就是说我们能在log(n)的时间内求出等比数列前
我们要求的不是前2的整数次幂的时候我们将n分解为2的整次幂的和;
比如求前等比数列11项的和,我们将11(二进制表示1011)分解为1+2+8(二进制1+10+1000)
前11项的和可以表示为:
可进一步表示为
即:
Well done!我们又把原式分解成了多个
一个快速幂大概这么写
int pow(int a,int b){int ans=1,power=a;while (b){if (b&1)ans*=power;power*=power;b>>=1;}return ans;}
注意,这里面的power一直充当
//等比数列求和//author:comzyh//等比数列求和#include <cstdio>const int MOD=9901;int A,B;int sum(int n,long long k){n%=MOD;int ans=0;int power=n;int powersum=n;//S(y)int mul=1;//a^xwhile (k){if (k&1){ans+=mul*powersum; ans%=MOD;mul*=power; mul%=MOD;}powersum*=(power+1); powersum%=MOD;power*=power; power%=MOD;k>>=1;}return ans;}int main(){int n,k;while (scanf("%d%d",&n,&k)!=EOF){printf("%d\n",sum(n,k));}return 0;}