题意
存在一个数列
\{ a_n\} (n\in \{ 0,1,2,\cdots ,10^{18}\cdots \} ) { a n } ( n ∈ { 0 , 1 , 2 , ⋯ , 1 0 1 8 ⋯ } ) 。
已知
a_0=-3,a_1=-6,a_2=-12,a_n=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n a 0 = − 3 , a 1 = − 6 , a 2 = − 1 2 , a n = 3 a n − 1 + a n − 2 − 3 a n − 3 + 3 n 。
现在给你给定的 n n ,令 p=10^{9}+7 p = 1 0 9 + 7 ,请你求出 a_n \bmod p a n mod p 。
Solutions
Sol 1
Sol 2
直接暴力递推,时间复杂度
O(tn) O ( t n ) ,期望得分:
20~pts 2 0 p t s 。
Sol 3
考虑将递推式转化为矩阵乘法:
\begin{bmatrix} a_{i-1}\\a_{i-2}\\a_{i-3}\\3^i \end{bmatrix} \times \begin{bmatrix} 3&1&-3&1\\1&0&0&0\\0&1&0&0\\0&0&0&3\end{bmatrix} = \begin{bmatrix} a_{i}\\a_{i-1}\\a_{i-2}\\3^{i+1} \end{bmatrix} ⎣ ⎢ ⎢ ⎡ a i − 1 a i − 2 a i − 3 3 i ⎦ ⎥ ⎥ ⎤ × ⎣ ⎢ ⎢ ⎡ 3 1 0 0 1 0 1 0 − 3 0 0 0 1 0 0 3 ⎦ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎡ a i a i − 1 a i − 2 3 i + 1 ⎦ ⎥ ⎥ ⎤
因为矩阵满足结合律,快速幂即可,时间复杂度
O\left(4^3 \times t\log {n}\right) O ( 4 3 × t log n )
加上对于数据点12的打表,期望得分: 20-60~pts 2 0 − 6 0 p t s
Sol 4
由题目名字得知这是一个数学题。
构造关于
x x 的OGF:
f(x)=a_0x^0+a_1x^1+a_2x^2+a_3x^3+\cdots +a_nx^n+\cdots f ( x ) = a 0 x 0 + a 1 x 1 + a 2 x 2 + a 3 x 3 + ⋯ + a n x n + ⋯ ,
那么可以得到:
(3x^3-x^2-3x+1)f(x)=a_0x^0+(a_1-3a_0)x^1+(a_2-3a_1-a_0)x^2+3^3x^3+\cdots+3^nx^n+\cdots ( 3 x 3 − x 2 − 3 x + 1 ) f ( x ) = a 0 x 0 + ( a 1 − 3 a 0 ) x 1 + ( a 2 − 3 a 1 − a 0 ) x 2 + 3 3 x 3 + ⋯ + 3 n x n + ⋯
将
a_0=-3,a_1=-6,a_2=-12 a 0 = − 3 , a 1 = − 6 , a 2 = − 1 2 代入后得:
(3x^3-x^2-3x+1)f(x)=-3+3^1x^1+3^2x^2+3^3x^3+\cdots+3^nx^n+\cdots ( 3 x 3 − x 2 − 3 x + 1 ) f ( x ) = − 3 + 3 1 x 1 + 3 2 x 2 + 3 3 x 3 + ⋯ + 3 n x n + ⋯
因式分解后得到:
(3x-1)(x+1)(x-1)f(x)=-3+3^1x^1+3^2x^2+3^3x^3+\cdots+3^nx^n+\cdots ( 3 x − 1 ) ( x + 1 ) ( x − 1 ) f ( x ) = − 3 + 3 1 x 1 + 3 2 x 2 + 3 3 x 3 + ⋯ + 3 n x n + ⋯
用等比数列求和公式化简:
(3x-1)(x+1)(x-1)f(x)=-4+\dfrac{1}{1-3x}=\dfrac{12x-3}{1-3x} ( 3 x − 1 ) ( x + 1 ) ( x − 1 ) f ( x ) = − 4 + 1 − 3 x 1 = 1 − 3 x 1 2 x − 3 f(x)=\dfrac{12x-3}{(1-3x)^2(1+x)(1-x)} f ( x ) = ( 1 − 3 x ) 2 ( 1 + x ) ( 1 − x ) 1 2 x − 3
用待定系数法把这个式子拆开:
\dfrac{12x-3}{(1-3x)^2(1+x)(1-x)}=\dfrac{A}{(1-3x)^2}+\dfrac{B}{1+x}+\dfrac{C}{1-x}+\dfrac{D}{1-3x} ( 1 − 3 x ) 2 ( 1 + x ) ( 1 − x ) 1 2 x − 3 = ( 1 − 3 x ) 2 A + 1 + x B + 1 − x C + 1 − 3 x D A=\dfrac{12x-3}{(1+x)(1-x)} \Bigg|_{x=\frac{1}{3}}=\dfrac{9}{8} A = ( 1 + x ) ( 1 − x ) 1 2 x − 3 ∣ ∣ ∣ ∣ ∣ x = 3 1 = 8 9 B=\dfrac{12x-3}{(1-3x)^2(1-x)} \Bigg|_{x=-1}=-\dfrac{15}{32} B = ( 1 − 3 x ) 2 ( 1 − x ) 1 2 x − 3 ∣ ∣ ∣ ∣ ∣ x = − 1 = − 3 2 1 5 C=\dfrac{12x-3}{(1-3x)^2(1+x)} \Bigg|_{x=1}=\dfrac{9}{8} C = ( 1 − 3 x ) 2 ( 1 + x ) 1 2 x − 3 ∣ ∣ ∣ ∣ ∣ x = 1 = 8 9
D单独求:
\because \dfrac{(12x-3)x}{(1-3x)^2(1+x)(1-x)}=\dfrac{Ax}{(1-3x)^2}+\dfrac{Bx}{1+x}+\dfrac{Cx}{1-x}+\dfrac{Dx}{1-3x} ∵ ( 1 − 3 x ) 2 ( 1 + x ) ( 1 − x ) ( 1 2 x − 3 ) x = ( 1 − 3 x ) 2 A x + 1 + x B x + 1 − x C x + 1 − 3 x D x \therefore \lim_{x \to \infty} (xf(x))=0 ∴ x → ∞ lim ( x f ( x ) ) = 0 \therefore \lim_{x \to \infty} (B-C-\dfrac{1}{3}D)=0 ∴ x → ∞ lim ( B − C − 3 1 D ) = 0 \therefore D=3\times(B-C)=-\dfrac{153}{32} ∴ D = 3 × ( B − C ) = − 3 2 1 5 3
将求得的
A A ,
B B ,
C C ,
D D 代入
f(x) f ( x ) 中:
\because A=\dfrac{9}{8},B=-\dfrac{15}{32},C=\dfrac{9}{8},D=-\dfrac{153}{32} ∵ A = 8 9 , B = − 3 2 1 5 , C = 8 9 , D = − 3 2 1 5 3 \therefore f(x)=\dfrac{9}{8(1-3x)^2}-\dfrac{15}{32(1+x)}+\dfrac{9}{8(1-x)}-\dfrac{153}{32(1-3x)} ∴ f ( x ) = 8 ( 1 − 3 x ) 2 9 − 3 2 ( 1 + x ) 1 5 + 8 ( 1 − x ) 9 − 3 2 ( 1 − 3 x ) 1 5 3 \therefore f(x)=\dfrac{9}{8}\sum^{\infty}_{i=0}x^i-\dfrac{15}{32}\sum^{\infty}_{i=0}(-1)^ix^i-\dfrac{153}{32}\sum^{\infty}_{i=0}3^ix^i+\dfrac{9}{8}\sum^{\infty}_{i=0}3^ix^i(i+1) ∴ f ( x ) = 8 9 i = 0 ∑ ∞ x i − 3 2 1 5 i = 0 ∑ ∞ ( − 1 ) i x i − 3 2 1 5 3 i = 0 ∑ ∞ 3 i x i + 8 9 i = 0 ∑ ∞ 3 i x i ( i + 1 ) \therefore f(x)=\dfrac{1}{32} \sum^{\infty}_{i=0} \left[ 3^{i+2}\times (4i-13)+36-15\times (-1)^i \right] x^i ∴ f ( x ) = 3 2 1 i = 0 ∑ ∞ [ 3 i + 2 × ( 4 i − 1 3 ) + 3 6 − 1 5 × ( − 1 ) i ] x i \therefore a_n=\dfrac{3^{n+2}\times (4n-13)+36-15\times (-1)^n}{32} ∴ a n = 3 2 3 n + 2 × ( 4 n − 1 3 ) + 3 6 − 1 5 × ( − 1 ) n
快速幂即可,时间复杂度
O\left(t\log {n}\right) O ( t log n ) ,期望得分
30-60~pts 3 0 − 6 0 p t s 。
Sol 5
分析算法后发现,Sol 3 因为常数巨大 而不够优秀,然而Sol 4 已经足够优秀 却仍然超时。
发现
Sol 4 中最烧时间的就是求
3^{n+2} \bmod p 3 n + 2 mod p 的部分。
欧拉定理
因为
a^b\equiv a^{b \bmod \varphi(p)} \pmod{p} a b ≡ a b mod φ ( p ) (modp ) ,我们把时间复杂度成功地优化到了
O\left(t\log {p}\right) O ( t log p ) 。
考虑继续优化求
3^p \bmod p 3 p mod p 的部分。
"光速"幂
已知
p=10^9+7 p = 1 0 9 + 7 ,
\log_2{p}\leq 32 log 2 p ≤ 3 2 。所以我们预处理出
2^{16} 2 1 6 以内的所有快速幂情况,每一次快速幂就可以
O(1) O ( 1 ) 完成了!
分析后我们的算法时间复杂度为
O\left(2 \times 2^{16}+ 2t\right) O ( 2 × 2 1 6 + 2 t ) ,空间复杂度为
O(2^{16}) O ( 2 1 6 ) ,期望得分:
80-100~pts 8 0 − 1 0 0 p t s 。
仍然不够优秀,考虑常数优化,如:
合理使用long long
来减少取模的常数。
使用循环展开来降低常数。
使用inline
,register
等常见的优化常数的技巧。
以上是std使用的优化方法,下面是一些神奇的优化方法(出题人没试过):
修改Mker
中常数大的地方来减少常数。
更多的编译优化&指令集?
在代码里注入czakioi
等玄学的信仰优化
Code
#include <bits/stdc++.h>
using namespace std ;
namespace Mker
{
#include <climits>
#define ull unsigned long long
#define uint unsigned int
ull sd;int op;
inline void init () {scanf ("%llu %d" , &sd, &op);}
inline ull ull_rand ()
{
sd ^= sd << 43 ;
sd ^= sd >> 29 ;
sd ^= sd << 34 ;
return sd;
}
inline ull rand ()
{
if (op == 0 ) return ull_rand() % USHRT_MAX + 1 ;
if (op == 1 ) return ull_rand() % UINT_MAX + 1 ;
if (op == 2 ) return ull_rand();
}
}
#define re register int
#define ll long long
#define ull unsigned long long
#define in inline
const int base=16 ,lim=(1 <<16 )-1 ,inv32=281250002 ;
const ll p=1e9 +7 ,pp=p*p;
int t,pre,ans,mul[2 ][lim+1 ];
ll m;
in ll multi (re a) {ll b=mul[0 ][a&lim];a>>=base;if (a)b=b*mul[1 ][a&lim]%p;return b;}
in void get_multi ()
{
mul[0 ][0 ]=mul[1 ][0 ]=1 ;mul[0 ][1 ]=3 ;
for (re j=2 ;j<=lim;j++) mul[0 ][j]=1l l*mul[0 ][1 ]*mul[0 ][j-1 ]%p;
mul[1 ][1 ]=1l l*mul[0 ][lim]*mul[0 ][1 ]%p;
for (re j=2 ;j<=lim;j++) mul[1 ][j]=1l l*mul[1 ][1 ]*mul[1 ][j-1 ]%p;
}
int main ()
{
scanf ("%d" ,&t);Mker::init();get_multi();
while (t--)
{
ull n=Mker::rand();
pre=(n&1 )?51 :21 ;m=((n%p)<<2 )-13 +p;
ans^=(((multi((n+2 )%(p-1 ))*m)%p+pre)*inv32+pp)%p;
}
printf ("%d" ,ans);
return 0 ;
}
评论
发表评论