:warning: math/sum_power_poly_limit.hpp

Code

#pragma once
#include<vector>

// \sum_{i=0}^{\infty} r^i f(i) (deg f <= d)
template<typename T>
T sum_power_poly_limit(T r,int d,std::vector<T>fs){
    vector<T>rr(d+1);
    rr[0]=1;
    for(int i=1;i<d+1;++i)rr[i]=rr[i-1]*r;
    T ans=0,sumRF=0;
    for(int i=0;i<d+1;++i){
        sumRF+=rr[i]*fs[i];
        ans += T(d-i).fact_inv()*T(i+1).fact_inv()*(((d - i)&1)?-1:1)*rr[d - i]*sumRF;
    }
    ans *= T(1-r).pow(MOD-(d+1))*T(d+1).fact();
    return ans;
}
#line 2 "math/sum_power_poly_limit.hpp"
#include<vector>

// \sum_{i=0}^{\infty} r^i f(i) (deg f <= d)
template<typename T>
T sum_power_poly_limit(T r,int d,std::vector<T>fs){
    vector<T>rr(d+1);
    rr[0]=1;
    for(int i=1;i<d+1;++i)rr[i]=rr[i-1]*r;
    T ans=0,sumRF=0;
    for(int i=0;i<d+1;++i){
        sumRF+=rr[i]*fs[i];
        ans += T(d-i).fact_inv()*T(i+1).fact_inv()*(((d - i)&1)?-1:1)*rr[d - i]*sumRF;
    }
    ans *= T(1-r).pow(MOD-(d+1))*T(d+1).fact();
    return ans;
}
Back to top page