@comzyh
2013-12-24T03:21:08.000000Z
字数 1584
阅读 2317
常见问题:给定整数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^x
while (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;
}