ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【洛谷5517】[MtOI2019] 幻想乡数学竞赛(数学)

2021-07-15 10:02:27  阅读:225  来源: 互联网

标签:洛谷 int sum MtOI2019 数学 frac n2 sd define


点此看题面

  • 已知\(a_0=-3,a_1=-6,a_2=-12\),且\(a_n=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n(n\ge 2)\),求\(a_n\)的值。
  • 数据组数\(\le5\times10^7\),\(n\le2^{64}-1\)

递推式变形

观察系数,发现刚好\(a_n\)与\(a_{n-2}\)系数相反,\(a_{n-1}\)与\(a_{n-3}\)系数相反,因此容易想到移项得到:

\[a_n-a_{n-2}=3(a_{n-1}-a_{n-3})+3^n \]

记\(b_n=a_n-a_{n-2}\),也就是说:

\[b_n=3b_{n-1}+3^n \]

然后发现这个\(3\)也大有玄机,我们给式子两侧同除以\(3^n\)得到:

\[\frac{b_n}{3^n}=\frac{b_{n-1}}{3^{n-1}}+1 \]

记\(c_n=\frac{b_n}{3^n}\),也就是说:

\[c_n=c_{n-1}+1 \]

代入几个初值,有\(c_0=-3,c_1=-2,c_2=-1\),由此可以直接得出:

\[c_n=n-3 \]

则\(b_n=(n-3)\times 3^n\),现在的问题就是通过\(b\)来还原\(a\)了。

通项公式的推导

首先列出式子:

\[a_n=\sum_{0\le i\le n,i\equiv n(mod\ 2)}(i-3)\times3^i \]

先考虑\(n\)为偶数的情况,直接枚举新的\(\frac{i'}2\):

\[a_n=\sum_{i=0}^{\frac n2}(2i-3)\times9^{i}=2\sum_{i=0}^{\frac n2}i\times 9^i-3\sum_{i=0}^{\frac n2}9^i \]

后面的\(\sum_{i=0}^{\frac n2}9^i\)可以直接利用等比数列求和公式计算,等于\(\frac{9^{\frac n2+1}-1}8\)。

至于前面那项,设\(f(m)=\sum_{i=0}^mi\times 9^i\),有一个经典的转化套路:

\[\begin{aligned} f(m)&=\sum_{i=1}^m\sum_{j=i}^m9^i\\ &=\sum_{i=1}^m\frac{9^{m+1}-9^i}{8}\\ &=\frac{m\times9^{m+1}}8-\frac{9^{m+1}-9}{64}\\ &=\frac{(8m-1)9^{m+1}+9}{64} \end{aligned} \]

最后总结一下,根据奇偶性列出\(a_n\)的两种通项公式:

\[a_n= \begin{cases} 2f(\frac n2)-\frac38\times(9^{\frac n2+1}-1)&(n\ is\ \texttt{even})\\ 6f(\frac {n-1}2)-\frac34\times(9^{\frac {n-1}2+1}-1)&(n\ is\ \texttt{odd}) \end{cases} \]

虽然式子中有很多幂,但它们都是以\(9\)为底的,可以预处理一下实现光速幂。

代码:\(O(T)\)

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Rg register
#define RI Rg int
#define Cn const
#define CI Cn int&
#define I inline
#define W while
#define S 32768
#define X 1000000007
#define ull unsigned long long
using namespace std;
Cn int I2=500000004,I4=1LL*I2*I2%X,I8=1LL*I2*I4%X,I64=1LL*I8*I8%X;
ull n;int p[S+5],pp[S+5];I int P9(ull y) {return y%=X-1,1LL*pp[y/S]*p[y%S]%X;}//求9^y
namespace Generator
{
	ull sd;int op;I void GetSeed() {scanf("%llu%d",&sd,&op);}
	I ull Rand() {return sd^=sd<<43,sd^=sd>>29,sd^=sd<<34,sd;}
	I ull R() {return op?(op==1?Rand()%UINT_MAX+1:Rand()):Rand()%USHRT_MAX+1;}
}using namespace Generator;
I int F(Cn ull& m) {return ((8LL*(m%X)-1+X)*P9(m+1)+9)%X*I64%X;}//计算∑i*(9^i)
int main()
{
	RI i;for(p[0]=i=1;i<=S;++i) p[i]=9LL*p[i-1]%X;for(pp[0]=i=1;i<=S;++i) pp[i]=1LL*pp[i-1]*p[S]%X;//预处理实现光速幂
	RI Tt,t=0;scanf("%d",&Tt),GetSeed();W(Tt--) n=R(),
		t^=n&1?(6LL*F(n-1>>1)-3LL*I4*(P9((n-1>>1)+1)-1)%X+X)%X:(2LL*F(n>>1)-3LL*I8*(P9((n>>1)+1)-1)%X+X)%X;//分奇偶性计算
	return printf("%d\n",t),0;
}

标签:洛谷,int,sum,MtOI2019,数学,frac,n2,sd,define
来源: https://www.cnblogs.com/chenxiaoran666/p/Luogu5517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有