等比数列求和(倍增法)

原创 2018年04月15日 14:38:59

题目大意:给定n,l,ri=lrni其中2<=n<=109;1<=l,r<=1018

总之就是求和公式不可用问题
1. 提公因式nl,原式变为nli=0rlni
2. log2l求出nl
3. 方便起见,我们定义自然数集上的函数f(i)=f2(i1)f(0)=1,f(1)=n以及h(i)=h(i1)(f(i)+1)h(0)=1,定义变量len=rl+1
4. 对于i=0len1ni,我们隔一个数提一次公因式,得到(n+1)i=0len12n2i
5. 以此类推,我们得到len=2k时,i=0len1ni=i=0k1(n2i+1)
6. 特殊地,当len=1时,有i=0len1ni=1显然成立
7. 我们通过画图发现,求和得到的ans其实与len的二进制位相关
8. 通过更进一步观察,我们得到如下结论:ans需要进行一次求和,当且仅当len二进制位当前位为1
9. 再结合之前提公因式得到的结论,我们得到anslen倒数第k位为1时需要同h(k1)·f(k)len2k11求和
10. 对于f(x)h(x)我们可以在O(60)的复杂度内完成预处理
11. 于是我们就得到了这份时间复杂度最差为O(3600)的代码

void solve2(){
    n%=MOD;
    a[0]=b[0]=1;
    a[1]=n;
    for(int i=2;i<=60;++i) a[i]=a[i-1]*a[i-1]%MOD;
    for(int i=1;i<=60;++i) b[i]=b[i-1]*(a[i]+1)%MOD;
    long long ans=0,w=n,pw=1;
    r=r-l+1;
    while(l){
        if(l&1) pw=pw*w%MOD;
        l>>=1,w=w*w%MOD;
    }int t=0;
    while(r){
        if(r&1){
            long long y=r-1,q=1;w=a[t+1];
            while(y){
                if(y&1) q=q*w%MOD;
                y>>=1,w=w*w%MOD;
            }ans=(ans+q*b[t])%MOD;
        }r>>=1,++t;
    }printf("%lld\n",ans*pw%MOD);
}

倍增法的妙用

倍增法 例:给出n、x、p三个正整数,问(x^0+x^1+x^2+……+x^n) 对p取模的结果。数据规模:n、x、p 等比数列求和公式?  x^(n+1)-1 /  x-1 ? ...
  • water__er
  • water__er
  • 2013-08-10 16:39:19
  • 920

等比数列求和推导及优化

等比数列求和推导及优化
  • CHNWJD
  • CHNWJD
  • 2017-03-03 09:18:19
  • 467

POJ-1845-Sumdiv 等比数列求和/数学/(二分法/逆元法/变换取模法)

题意:输入a,b,求a^b的所有因子之和 http://poj.org/problem?id=1845 分解a的质因数a=p1^t1*p2^t1........ 每个质因数对sum的贡献...
  • viphong
  • viphong
  • 2016-02-19 23:42:08
  • 693

数学辨异 —— 泰勒展开与等比数列求和

11−x \frac{1}{1-x} 1. 泰勒展开根据:(1+z)α=1+αz+α(α−1)2!z2+α(α−1)(α−2)3!z3+⋯+α(α−1)⋯(α−n+1)n!zn+⋯,|z|...
  • lanchunhui
  • lanchunhui
  • 2017-01-18 13:16:42
  • 702

等比数列求和(C++实现)

第一种实现方式,最传统古老的,先求出每一项,然后再求和。#include #include using namespace std; int main(int argc, char* argv[]...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2015-12-25 17:26:58
  • 2188

等差、等比数列的求和公式

等差数列和公式 Sn=n(a1+an)/2=na1+n(n-1)/2 d 等比数列求和公式 q≠1时 Sn=a1(1-q^n)/(1-q)=(a1-anq)/(1-q) q=1时Sn=na1 (a1为...
  • kwame211
  • kwame211
  • 2017-12-01 14:39:16
  • 566

agile java 等比数列求和

好久没有写过东西了,最近正在看agile java (测试驱动开发)这本书,其开发思想方面的不再细说,下面这个是前两天在QQ群里的群友求助的——等比数列前N项和的算法,根据测试驱动开发的思想,写了这个...
  • xiaolei168
  • xiaolei168
  • 2010-08-17 13:10:00
  • 1022

等比数列求和快速幂

CF-678D 看求的和(a^n-1)/(a-1)按奇偶递推 #include using namespace std; const long long m=1e9+7; ...
  • sinat_33397705
  • sinat_33397705
  • 2016-06-14 14:06:49
  • 200

【例题&结论】【分治(等比数列二分求和)】NKOJ 3716 数列求和

NKOJ 3716 数列求和 时间限制 : - MS 空间限制 : 65536 KB 评测说明 : 时限1000ms 问题描述 给出三个整数A,n和p,计算 Sn=(A^1+A^2+...
  • Y__XV
  • Y__XV
  • 2016-07-18 13:15:39
  • 280

倍增算法(LCA)

在前面的博客中讲到,Tarjan算法是解决离线LCA的高效算法。可是,如果LCA要求强制在线呢? 这时有两种解决的办法,其中一种常数较小的就是倍增算法了(又称跳表法)。 顾名思义:就是利用倍增的思...
  • ouqingliang
  • ouqingliang
  • 2017-07-10 16:26:50
  • 1353
收藏助手
不良信息举报
您举报文章:等比数列求和(倍增法)
举报原因:
原因补充:

(最多只允许输入30个字)