背景:
bzoj
\text{bzoj}
bzoj权限题?
没事
loj
\text{loj}
loj有原题。
题目传送门:
题意:
求:
∑
i
=
0
n
∑
j
=
1
a
+
i
⋅
d
∑
l
=
1
j
l
k
m
o
d
  
p
\sum_{i=0}^{n}\sum_{j=1}^{a+i\cdot d}\sum_{l=1}^{j}l^k \mod p
∑i=0n∑j=1a+i⋅d∑l=1jlkmodp。
思路:
做法很妙,实在想不到。
一般人会去化简式子,可是根本化不动,我太菜了。
巨佬们给的做法是:
设
f
x
=
∑
i
=
1
x
i
k
f_x=\sum_{i=1}^{x}i^k
fx=∑i=1xik。
我们发现
f
x
f_x
fx是一个
k
+
1
k+1
k+1次的多项式。
证明就是:
f
x
=
∑
i
=
1
x
i
k
=
1
k
+
1
∑
i
=
1
k
+
1
C
k
+
1
i
⋅
B
k
+
1
−
i
⋅
(
x
+
1
)
i
=
1
k
+
1
∑
i
=
1
k
+
1
C
k
+
1
i
⋅
B
k
+
1
−
i
⋅
∑
j
=
0
i
C
(
i
j
)
x
j
1
i
−
j
=
1
k
+
1
∑
i
=
1
k
+
1
C
k
+
1
i
⋅
B
k
+
1
−
i
⋅
∑
j
=
0
i
C
(
i
j
)
x
j
\begin{aligned}f_x&=\sum_{i=1}^{x}i^k\\ &=\frac{1}{k+1}\sum_{i=1}^{k+1}C_{k+1}^{i}\cdot B_{k+1-i}\cdot (x+1)^i\\ &=\frac{1}{k+1}\sum_{i=1}^{k+1}C_{k+1}^{i}\cdot B_{k+1-i}\cdot \sum_{j=0}^{i}C(_{i}^{j})x^j1^{i-j}\\ &=\frac{1}{k+1}\sum_{i=1}^{k+1}C_{k+1}^{i}\cdot B_{k+1-i}\cdot \sum_{j=0}^{i}C(_{i}^{j})x^j\end{aligned}
fx=i=1∑xik=k+11i=1∑k+1Ck+1i⋅Bk+1−i⋅(x+1)i=k+11i=1∑k+1Ck+1i⋅Bk+1−i⋅j=0∑iC(ij)xj1i−j=k+11i=1∑k+1Ck+1i⋅Bk+1−i⋅j=0∑iC(ij)xj
其中
B
B
B是伯努利数。
j
j
j的上限是
i
i
i,
i
i
i的上限为
k
+
1
k+1
k+1,故
x
j
x^j
xj的最大次数为
k
+
1
k+1
k+1,因此得证。
设
g
x
=
∑
i
=
1
x
f
i
g_x=\sum_{i=1}^{x}f_i
gx=∑i=1xfi。
我们发现
g
g
g是一个
k
+
2
k+2
k+2次的多项式。
证明就是:
g
x
=
∑
i
=
1
x
∑
j
=
1
j
j
k
=
∑
i
=
1
x
1
k
+
1
∑
j
=
1
k
+
1
C
k
+
1
j
⋅
B
k
+
1
−
j
⋅
(
i
+
1
)
j
=
1
k
+
1
∑
i
=
1
x
∑
j
=
1
k
+
1
C
k
+
1
j
⋅
B
k
+
1
−
j
⋅
∑
l
=
0
j
C
j
l
⋅
i
l
⋅
1
j
−
l
=
1
k
+
1
∑
i
=
1
x
∑
j
=
1
k
+
1
C
k
+
1
j
⋅
B
k
+
1
−
j
⋅
∑
l
=
0
j
C
j
l
⋅
i
l
=
1
k
+
1
∑
j
=
1
k
+
1
C
k
+
1
j
⋅
B
k
+
1
−
j
⋅
∑
l
=
0
j
C
j
l
⋅
∑
i
=
1
x
i
l
\begin{aligned}g_x&=\sum_{i=1}^{x}\sum_{j=1}^{j}j^k\\ &=\sum_{i=1}^{x}\frac{1}{k+1}\sum_{j=1}^{k+1}C_{k+1}^{j}\cdot B_{k+1-j}\cdot (i+1)^j\\ &=\frac{1}{k+1}\sum_{i=1}^{x}\sum_{j=1}^{k+1}C_{k+1}^{j}\cdot B_{k+1-j}\cdot \sum_{l=0}^{j}C_{j}^{l}\cdot i^l\cdot 1^{j-l}\\ &=\frac{1}{k+1}\sum_{i=1}^{x}\sum_{j=1}^{k+1}C_{k+1}^{j}\cdot B_{k+1-j}\cdot \sum_{l=0}^{j}C_{j}^{l}\cdot i^{l}\\ &=\frac{1}{k+1}\sum_{j=1}^{k+1}C_{k+1}^{j}\cdot B_{k+1-j}\cdot \sum_{l=0}^{j}C_{j}^{l}\cdot\sum_{i=1}^{x} i^{l}\end{aligned}
gx=i=1∑xj=1∑jjk=i=1∑xk+11j=1∑k+1Ck+1j⋅Bk+1−j⋅(i+1)j=k+11i=1∑xj=1∑k+1Ck+1j⋅Bk+1−j⋅l=0∑jCjl⋅il⋅1j−l=k+11i=1∑xj=1∑k+1Ck+1j⋅Bk+1−j⋅l=0∑jCjl⋅il=k+11j=1∑k+1Ck+1j⋅Bk+1−j⋅l=0∑jCjl⋅i=1∑xil
上面我们已经证明了形如 ∑ i = 1 x i l \sum_{i=1}^{x} i^{l} ∑i=1xil是 l + 1 l+1 l+1次方的, l l l的上限是 j j j, j j j的上限是 k + 1 k+1 k+1,当 l = j = k + 1 l=j=k+1 l=j=k+1时,为 k + 2 k+2 k+2次方,得证。
设
h
x
=
∑
i
=
1
x
g
a
+
i
⋅
d
h_x=\sum_{i=1}^{x}g_{a+i\cdot d}
hx=∑i=1xga+i⋅d。
我们发现
g
g
g是一个
k
+
3
k+3
k+3次的多项式。
证明就是:
在原来的基础上,再套一层即可。
剩下的按照次数拉格朗日插值即可。
时间复杂度好像有点大:
Θ
(
n
3
)
\Theta(n^3)
Θ(n3)。
其实可以
Θ
(
n
2
)
\Theta(n^2)
Θ(n2)(重心拉格朗日插值),当然我很懒,既然模板都没打,为什么要打呢。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define LD long double
#define mod 1234567891ll
using namespace std;
int k;
LL p,n,d;
LL f[1010],g[1010],h[1010];
struct node{LL x,y;} a[1010];
LL times(LL x,LL y)
{
LD t=(LD)x*(LD)y-(LL)((LD)x*(LD)y/(LD)mod)*(LD)mod;
LL tt=(LL)t;
return tt>=0?tt%mod:(tt+mod)%mod;
}
LL dg(LL x,LL y)
{
if(!y) return 1;
LL op=dg(x,y>>1);
if(y&1) return times(times(op,op),x); else return times(op,op);
}
LL inv(LL x)
{
return dg(x,mod-2);
}
LL lagrange(LL x,int limit)
{
LL sum=0;
for(int i=0;i<=limit;i++)
{
LL op1=a[i].y,op2=1;
for(int j=0;j<=limit;j++)
{
if(i==j) continue;
op1=times(op1,(x-a[j].x+mod)%mod);
op2=times(op2,(a[i].x-a[j].x+mod)%mod);
}
sum=(sum+times(op1,inv(op2)))%mod;
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %lld %lld %lld",&k,&p,&n,&d);
for(int i=1;i<=k+3;i++)
f[i]=(f[i-1]+dg(i,k))%mod;
for(int i=1;i<=k+3;i++)
g[i]=(g[i-1]+f[i])%mod;
for(int i=0;i<=k+3;i++)
a[i]=(node){(LL)i,g[i]};
for(int i=0;i<=k+4;i++)
h[i]=((!i?0:h[i-1])+lagrange((p+times(i,d))%mod,k+3))%mod;
for(int i=0;i<=k+4;i++)
a[i]=(node){(LL)i,h[i]};
printf("%lld\n",lagrange(n,k+4));
}
}