類歐幾里得演算法

2022-05-20 05:00:48 字數 3840 閱讀 2094

對於給定的元\(a,b,c,n\)

設\(f(i)=\lfloor\frac\rfloor\)

求\[f(a,b,c,n)=\sum_0^nf(i)

\]\[g(a,b,c,n)=\sum_0^nf(i)^2

\]\[h(a,b,c,n)=\sum_0^ni\cdot f(i)

\]\[\lfloor\frac\rfloor=\lfloor\frac\rfloor+i\lfloor \frac\rfloor +\lfloor \frac\rfloor

\]\[f(a,b,c,n)=f(a\mod c,b\mod c,c,n)+\frac\rfloor}+(n+1)\lfloor\frac\rfloor

\]\[f(a,b,c,n) =\sum_0^n f(i)

\]\[= \sum_^n\sum_^ 1

\]\[= \sum_^n\sum_^[j

\[= \sum_^\sum_^[j

其中\[[j<\lfloor\frac\rfloor] =[j<\lceil\frac\rceil]

\]\[=[cj

\[=[ai>cj-b+c-1]

\]\[=[i>\lfloor\frac\rfloor]

\]\[f(a,b,c,n)= \sum_^\sum_^[i>\lfloor\frac\rfloor]

\]\[=\sum_^ n-\lfloor\frac\rfloor

\]\[f(a,b,c,n)=n\cdot f(n)-f(c,-b+c-1,a,f(n)-1)

\]每次操作交換了\(a,c\)然後再次取模,複雜度是\(o(\log n)\)

遞迴邊界是\(a=0\)

\(g(a,b,c,n)=\sum_0^nf(i)^2\)

設\(\lfloor \frac\rfloor=x,\lfloor \frac\rfloor=y\)

\[\lfloor\frac\rfloor^2=(\lfloor\frac\rfloor+ix+y)^2

\]\[=\lfloor\frac\rfloor^2+2\lfloor\frac\rfloor\cdot (ix+y)+(ix+y)^2

\]\[g(a,b,c,n)=

\]\[g(a\mod c,b\mod c,c,n)+2x h(a\mod c,b\mod c,n)+2y f(a\mod c,b\mod c,c,n)

\]\[+\frac+(n+1)y^2+n(n+1)xy

\]\[g(a,b,c,n) =\sum_0^nf(i)^2

\]\[= 2 \sum_^n\frac+\frac

\]\[=2 \sum_^n\sum_^j+\frac

\]\[= 2\sum_^n\sum_^(j+\frac)[j

\[= 2\sum_^\sum_^(j+\frac)[j

\[=2 \sum_^\sum_^(j+\frac)[i>\lfloor\frac\rfloor]

\]\[=2\sum_^ (j+\frac)(n-\lfloor\frac\rfloor)

\]\[g(a,b,c,n)=nf(n)^2-2h(c,-b+c-1,a,f(n)-1)-f(c,-b+c-1,a,f(n)-1)

\]\(h(a,b,c,n)=\sum_0^ni\cdot f(i)\)

\[i\cdot \lfloor\frac\rfloor=i\cdot (\lfloor\frac\rfloor+i\lfloor \frac\rfloor +\lfloor \frac\rfloor)

\]\[i\cdot \lfloor\frac\rfloor=i\cdot \lfloor\frac\rfloor+i^2\lfloor \frac\rfloor +i\lfloor \frac\rfloor

\]\[h(a,b,c,n)=h(a\mod c,b\mod c,c,n)+\frac\rfloor}+\frac\rfloor}

\]\[h(a,b,c,n)=\sum_i^n i\cdot f(i)

\]\[= \sum_^n\sum_^ i

\]\[= \sum_^\sum_^i\cdot [j<\lfloor\frac\rfloor]

\]\[=\sum_0^\sum_^n i\cdot [i>\lfloor\frac\rfloor]

\]設\(f'(i)=\lfloor\frac\rfloor\)

\[h(a,b,c,n)= \sum_^\sum_^i

\]\[= \sum_^\frac

\]\[= \sum_^ \frac

\]\(h(a,b,c,n)=\frac\)

這個多個函式的情況,如果直接遞迴寫複雜度極高

所以需要把訪問到的所有狀態存下來遞推,就能保證複雜度\(o(\log n)\)

模板題傳送門

#includeusing namespace std;

#define mod1(x) ((x>=p)&&(x-=p))

#define mod2(x) ((x<0)&&(x+=p))

#define reg register

typedef long long ll;

#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)

#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)

#define pb push_back

template inline void cmin(t &a,t b)

template inline void cmax(t &a,t b)

const ll inv2=(p+1)/2,inv6=qpow(6);

//ll f(ll a,ll b,ll c,ll n);

//ll g(ll a,ll b,ll c,ll n);

//ll h(ll a,ll b,ll c,ll n);

ll d2(ll n)

ll d3(ll n)

ll sa[n],sb[n],sc[n],sn[n];

ll f[n],g[n],h[n];

int cnt;

void precalc(ll a,ll b,ll c,ll n)

}/*ll f(ll a,ll b,ll c,ll n)

ll t=(a*n+b)/c;

ll ans=t%p*n%p-f(c,-b+c-1,a,t-1);

ans=(ans%p+p)%p;

return ans;

}ll g(ll a,ll b,ll c,ll n)

ll t=(a*n+b)/c;

ll ans=(t%p)*(t%p)%p*(n%p)%p-2*h(c,-b+c-1,a,t-1)-f(c,-b+c-1,a,t-1)%p;

ans=(ans%p+p)%p;

return ans;

}ll h(ll a,ll b,ll c,ll n)

ll t=(a*n+b)/c;

ll ans=(t%p*d2(n)%p*2%p-g(c,-b+c-1,a,t-1)-f(c,-b+c-1,a,t-1))%p;

ans=(ans*inv2%p+p)%p;

return ans;

}*/int main() else

if(a==0) g[i]=(b/c)*(b/c)%p*(n+1)%p;

else if(a>=c || b>=c) else

if(a==0) h[i]=d2(n)%p*(b/c)%p;

if(a>=c || b>=c) else

} printf("%lld %lld %lld\n",f[1],g[1],h[1]);

}}

類歐幾里得演算法

比較快速地算出下面的式子 f n,a,b,c,k 1,k 2 sum limits n x lfloor frac rfloor 不妨假設現在 a geq c 或 b geq c 那麼 sum limits n x lfloor frac rfloor sum limits n x lfloor f...

類歐幾里得演算法

這個演算法用於求一條直線下整點個數,我們定義 f a,b,c,n sum lfloor frac rfloor 其他幾個乘係數的擴充套件不想學了tat a ge c 或 b ge c 當 a ge c 或 b ge c 時,我們考慮把分子對 c 的商和餘數分別提出來,那麼有 begin f a,b,...

類歐幾里得演算法

萬惡之源 首先推一下可以發現,我們可以分 位 計算。設二進位制下第 k 對答案的貢獻為 mathrm 則 mathrm sum limits texttt sum limits left lfloor frac right rfloor bmod 2 sum limits left lfloor f...