背景:
博客还有好多没写,看看这个周日有空吗。
题目传送门:
https://www.luogu.org/problem/P4881
题意:
求:
a
n
s
=
∑
i
=
1
n
i
⋅
f
i
[
n
m
o
d
  
2
]
ans=\sum_{i=1}^{n}i\cdot f_i[n\mod 2]
ans=∑i=1ni⋅fi[nmod2],其中
f
i
f_i
fi表示字符集为小写字母的回文串的个数。
思路:
考虑回文串的前一段,显然
f
i
=
2
6
⌈
i
2
⌉
f_i=26^{\lceil\frac{i}{2}\rceil}
fi=26⌈2i⌉。
那么有:
a
n
s
=
∑
i
=
1
n
i
⋅
2
6
⌈
i
2
⌉
[
i
m
o
d
  
2
=
1
]
ans=\sum_{i=1}^{n}i\cdot26^{\lceil\frac{i}{2}\rceil}[i\mod 2=1]
ans=i=1∑ni⋅26⌈2i⌉[imod2=1]
考虑用
k
k
k枚举奇数,有:
a
n
s
=
∑
k
=
1
⌈
n
2
⌉
(
2
k
−
1
)
⋅
2
6
⌈
2
k
−
1
2
⌉
ans=\sum_{k=1}^{\lceil\frac{n}{2}\rceil}(2k-1)\cdot26^{\lceil\frac{2k-1}{2}\rceil}
ans=k=1∑⌈2n⌉(2k−1)⋅26⌈22k−1⌉
( 1 ) a n s = ∑ k = 1 ⌈ n 2 ⌉ ( 2 k − 1 ) ⋅ 2 6 k ( 2 ) 26 a n s = ∑ k = 1 ⌈ n 2 ⌉ ( 2 k − 1 ) ⋅ 2 6 k + 1 \begin{aligned}&(1)\ ans=\sum_{k=1}^{\lceil\frac{n}{2}\rceil}(2k-1)\cdot26^{k}\\ &(2)\ 26ans=\sum_{k=1}^{\lceil\frac{n}{2}\rceil}(2k-1)\cdot26^{k+1}\end{aligned} (1) ans=k=1∑⌈2n⌉(2k−1)⋅26k(2) 26ans=k=1∑⌈2n⌉(2k−1)⋅26k+1
(
2
)
−
(
1
)
(2)-(1)
(2)−(1)(考虑
2
6
o
p
26^{op}
26op次方一起计算,
o
p
∈
[
1
,
⌈
n
2
⌉
]
∩
N
+
op∈[1,\lceil\frac{n}{2}\rceil]∩N_+
op∈[1,⌈2n⌉]∩N+)得:
25
a
n
s
=
−
26
+
2
6
⌈
n
2
⌉
+
1
n
+
∑
i
=
2
⌈
n
2
⌉
−
2
⋅
2
6
i
25ans=-26+26^{\lceil\frac{n}{2}\rceil+1}n+\sum_{i=2}^{\lceil\frac{n}{2}\rceil}-2\cdot26^i
25ans=−26+26⌈2n⌉+1n+i=2∑⌈2n⌉−2⋅26i
a n s = − 26 + 2 6 ⌈ n 2 ⌉ + 1 n − 2 ∑ i = 2 ⌈ n 2 ⌉ 2 6 i 25 ans=\frac{-26+26^{\lceil\frac{n}{2}\rceil+1}n-2\sum_{i=2}^{\lceil\frac{n}{2}\rceil}26^i}{25} ans=25−26+26⌈2n⌉+1n−2∑i=2⌈2n⌉26i
后面就是一个等比数列求和,化简一下就可以了,这个在草稿本上写写即可。
n
m
o
d
  
2
=
0
n\mod2=0
nmod2=0时,让
n
−
1
n-1
n−1即可,反正第
n
n
n项不产生贡献,其实是我不特判会
wrong answer
\text{wrong answer}
wrong answer。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 1000000007
#define inv25 280000002
using namespace std;
LL n;
LL ksm(LL x,LL k)
{
LL tot=1;
for(;k;k>>=1)
{
if(k&1) tot=tot*x%mod;
x=x*x%mod;
}
return tot;
}
LL calc(LL x)
{
return (-26ll*26ll+ksm(26,x+1)+mod)%mod*inv25%mod;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(!(n&1)) n--;
printf("%lld\n",(-26ll+ksm(26,(n+1)/2+1)*n%mod-2ll*calc((n+1)/2)%mod+mod)%mod*inv25%mod);
}
}