比較快速地算出下面的式子
\[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...