類歐幾里得演算法

2022-05-03 18:18:09 字數 3455 閱讀 2860

比較快速地算出下面的式子

\[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\frac ac\rfloor x+\lfloor\frac bc\rfloor+\lfloor\frac\rfloor) ^\]設

\[p=\lfloor\frac ac\rfloor\\

q=\lfloor\frac bc\rfloor\\

a=a\mod c\\

b=b\mod c\\

\]那麼

\[\sum\limits_^n x^ (\lfloor\frac ac\rfloor x+\lfloor\frac bc\rfloor+\lfloor\frac\rfloor) ^\\

=\sum\limits_^n x^ (p x+q+\lfloor\frac\rfloor) ^\\

=\sum\limits_\frac p^iq^j\sum\limits_^nx^\lfloor\frac\rfloor^\\

=\sum\limits_\frac p^iq^jf(n,a,b,c,k_1+i,k)

\]注意到這一步我們令 \(a\) 變成了 \(a\mod c\)

於是,我們現在只需討論 \(a,b的情況了,注意到此時 \(\lfloor \frac\rfloor-\lfloor \frac\rfloor \leq 1\)

我們設 \(m=\lfloor \frac\rfloor\) ,

\[f(n,a,b,c,k_1,k_2)\\

=\sum\limits_^n x^ \lfloor\frac\rfloor ^\\

=\sum\limits_^n x^ (\sum\limits_^ \left[ \lfloor\frac\rfloor >w \right] )^\\

=\sum\limits_^n x^ \sum\limits_^ \left[ \lfloor\frac\rfloor >w \right] ((w+1)^-w^)\\

\lfloor \frac\rfloor > w \\

\updownarrow\\

\lfloor \frac\rfloor \geq w+1\\

\updownarrow\\

ax+b \geq cw+c\\

\updownarrow\\

ax\geq cw+c-b\\

\updownarrow\\

ax> cw+c-b-1\\

\updownarrow\\

x>\lfloor\frac\rfloor\\

f(n,a,b,c,k_1,k_2)\\

=\sum\limits_^((w+1)^-w^)\sum\limits_^n x^ \left[ x>\lfloor\frac\rfloor \right] \\

=(\sum\limits_^((w+1)^-w^)\sum\limits_^n x^)- (\sum\limits_^((w+1)^-w^)\sum\limits_^\rfloor} x^ )\\

=m^\sum\limits_^n x^- \sum\limits_^((w+1)^-w^)\sum\limits_^\rfloor} x^\\

\]注意此時左半部分可以用拉格朗日差值快速求得。

\(\sum\limits_^((w+1)^-w^)\) 是關於 \(w\) 的 \(k_2-1\) 次多項式,設為 \(a\) , \(i\) 次項係數為 \(a_i\)

\(\sum\limits_^\rfloor} x^\) 是關於 \(\lfloor\frac\rfloor\) 的 \(k_1+1\) 次多項式,設為 \(b\) , \(i\) 次項係數為 \(b_i\)

\[\sum\limits_^((w+1)^-w^)\sum\limits_^\rfloor} x^\\

=\sum\limits_^\sum\limits_^a_iw^i\sum\limits_^b_j\lfloor\frac \rfloor^\\

=\sum\limits_^\sum\limits_^a_ib_j\sum\limits_^w^i\lfloor\frac\rfloor^\\

=\sum\limits_^\sum\limits_^a_ib_jf(m-1,c,c-b-1,a,i,j)

\]此時我們本質上在接下來的運算中交換了 \(a,c\)

因此總的迭代次數是 \(o(log)\) 的,並且可以根據迭代的層數作為下標記憶化,並且 \(k_1,k_2\) 的和不會增大。

如果 \(a=0\) 或 \(m=0\) 或 \(k_2=0\) 之類的邊界情況可以直接拉格朗日插值快速求得。

loj138 ac**如下

#includeusing namespace std;

#define ll long long

#define debug(x) cerr<<#x<<" = "<#define mp make_pair

#define pb push_back

inline int read()

#define mod 1000000007

namespace calc

inline int mns(int x,int y)

inline int mul(int x,int y)

inline void upd(int &x,int y)

inline void dec(int &x,int y)

inline int qpow(int x,int sq)

}using namespace calc;

int fac[50],ifac[50],c[50][50],g[80][11][11];

namespace lagrange

for(int i=0;i<=m;i++) f[i]=t[i][m+1];

} inline int calc_b(int x,int k)

void init()

} using lagrange::a;

using lagrange::b;

using lagrange::calc_b;

namespace __euclid

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

return res;

} int m=((ll)a*(ll)n+(ll)b)/c; res=mul(qpow(m,k2),calc_b(n,k1));

for(int p=0;pdec(res,mul(mul(c[k2][p],b[k1][q]),f(p,q,c,c-b-1,a,m-1,lev+1)));

return res;

}} using __euclid::f;

int main() return 0;

}

類歐幾里得演算法

這個演算法用於求一條直線下整點個數,我們定義 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,...

類歐幾里得演算法

對於給定的元 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 rfloo...

類歐幾里得演算法

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