1 条题解
-
0
自动搬运
来自洛谷,原作者为

the_Death
AFO搬运于
2025-08-24 21:55:11,当前版本为作者最后更新于2019-11-04 21:17:57,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这题是真的好,我是真的自己做不出来QAQ
P3981 琅泽难题
这在官方题解基础上,加上自己的一些理解所写,原题解见此题解最下方链接
题目解答
首先,由图可知,规律是对上一层每一个数字进行一次描述,是对上一层数字所构成的连续区间进行描述。
- 例如,若有一层为(不一定合法):1113115
- 若按照规律对其进行描述,则就是:11111113111115->1个1(x3遍)+1个3+1个1(x2遍)+1个5。
- 如果按照规律对其进行描述则为:31132115->3个1+1个3+2个1+1个5
然后寻找第层中由几个的规律了
首先我们假设初始数据为,以此来构造矩阵:(为方便记录,每一行最左侧为层数)
- a
- 1 1
- 1 1 1 a
- 3 1 1 a
- 1 3 1 1 1 1 1 a
- 1 1 1 3 5 1 1 a
- 1 1 1 1 1 1 1 3 1 5 1 1 1 1 1 a
- 7 1 1 3 1 1 1 5 5 1 1 a
- 1 7 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 5 1 5 1 1 1 1 1 a
- 1 1 1 7 5 1 1 3 7 1 1 5 1 1 1 5 5 1 1 a
此时,我们不难发现,当达到一个阈值的时候,不会在同一层出现第二个。我们此时要尝试找到这个阈值。
由上图的数据可猜测,这个阈值就是。然后我们来证明一下
在证明阈值为之前,我们先阐述两条结论:
- 在规律下,只会有 这样的数据,正确性显然
- 在规律下,会有 , 这样的数据,正确性显然
请大家牢记这两条正确性显然(尤其是第一条)的结论,这对于我们之后的证明有大用。然后我们开始证明
- 这个琅琊阵中不会出现偶数(若为偶数,则就只会出现一个偶数,即为)
- 考虑偶数出现的原因。
- 首先由于琅琊阵的规律我们可知,只有在规律下才可以出现偶数。那么我们假设在规律下的那一层数据为:个连续的 和 个连续的 和 个连续的。我们要保证且。只有样才可以保证在描述的时候,不会包含多余的数字。
- 由于结论,我们可知,
- 如果的话,由于结论,如果这个数字不是的话,必然无法保证两两一致。所以。
- 如果的话,保证是偶数。那么后面的那个不同的数字为了不同,必然以 的形式出现,此时就不是偶数
- 如果不是偶数,由以上观点可知,且的出现都是成双成对的,所以必须是偶数
- 由以上证明可知琅泽阵之中不存在偶数
- 琅泽阵之中不存在大于的数字(除了本身)
- 假设它之中出现了,如果连除了和偶数以外的数字的最小值都无法出现,那么更大的数字就不可能出现了,这个正确性请感性了解一下
- 如果这之中出现了,那它必然是在层出现的。那么代表层之中有连续的个。也就是说再上一个层之中,有连续的个和个非数字。由于是描述一个连续区间的,所以这个无论如何都无法凑出,所以琅泽阵之中不可能出现
- 其余数字以此类推。故可得结论:琅泽阵之中除外,不可能出现大于的数字
至此,琅琊阵之中会出现的数字的讨论结束了。然后我们对分别寻找出现的规律
- 当且的时候,整个琅琊阵只存在一个
- 在第行后,若出现新的,则需满足在规律中出现个单独连续的(即这M3个左右两边都没有),那么在此又往上一次的规律中必须有两个连续的非数,然而这并不可能,因为在分的时候,若出现两个连续的和(,),则可能为
- ①个,与该规律矛盾!
- ②个,个,又与之矛盾!故往后不可能再出现新的。
- 而第四行出现的3是特殊情况,因为前两次的分恰好满足a单独存在,导致前一次出现连续三个1,而往后就没有了。
- 对于进行讨论
- 我们可以通过打表的方式得到的规律。由于的规律仅是对的一种逐个描述,不会在序列之中添加除了以外的其余的数字,所以这里我们只看规律
4 6 8 10 12 14 16 18 20 潜5 1 1 2 3 5 8 13 21 34 5数量 0 4 7 12 20 33 54 7数量 0 1 2 4 7 12 20 33 潜7 1 2 3 5 8 13 21 34 - 注:潜表示下一次规律要增加的,潜表示往后第二次要增加的
然后我们可以惊喜的发现这里有斐波那契数列!
- 事实上,是由上一次规律中两个单独连续的演变而来的,演变来之后随之又增加了两个单独连续的,也就是上一次规律带来了个并埋下了一个潜。
- 那为什么是斐波那契数列呢?我们又发现是由上两次规律中两个连续的不等数得来的。而第行由于在在前面,可以视为前面有一个与它不等的数,因此埋下了一个潜,在下一次规律中,并没有马上出现,而是演变成了个,此时由上一层演变而来的又与靠在了一起,埋下一个潜,那么该行就有一个潜一个潜。
- 也就是说,每一个潜都会带来个潜和个潜,而不难发现,每一个潜又会给下两行带来一个潜和潜。那么我们知道第四行是个潜和个潜,第六行由第四行的潜得到个潜和个潜,而第八行由第六行的潜得个潜和个潜,再由第四行的潜得到个潜和个潜 。
UPDATE:此处Latex炸了,故放上图片

这时我们回想斐波那契数列的原本的提出:刚出生的兔子,要再长一个月才可以生出兔子。而潜的增长方式与之相同。
总结以上,我们可知:潜和潜在每一层上都是相等的。但是潜对后面没有影响,每一个潜对其后面的第二次的规律有影响,即
我们设层的的数量为,设斐波那契数列为,那么层对应的潜或潜数量就是,故易得。(此处层数,仅仅是为了更好的编写程序,规律不会改变非数字的数目,所以不考虑也是可以的)
所以最后第的数目的答案式是。对于来讲,的数目与上一次相同规律的的数目是一样的。
至此,琅琊阵的规律全部解释完毕
程序构造
斐波那契数列的公式大家都知道,但是由于实现太少,所以这样的方法肯定不对。我们可以进一步考虑奇数项和偶数项的求和公式,即为
但是仅仅依靠这两个公式,你还是会超时,你想到了还有一种公式,叫做二倍项公式
它可以化为
运用这个公式,你就可以获得的好结果
code
#include<iostream> #include<cstdio> using namespace std; long long k,l,r,t,ans,a,p,q; const long long mod=20171111; inline void solve(long long a){ if(a==2) k=1,l=1;//k->F[n],l->F[n-1] else if(a%2==0) solve(a/2),t=k*k+2*k*l,//二次项公式 l=k*k+l*l,k=t;//二次项公式 else if(a%2==1) solve(a-1),t=k+l,l=k,k=t;//普通公式 k%=mod,l%=mod; } int main(){ scanf("%lld%lld%lld",&a,&q,&p); if(p==5||p==7){ q-=4,q/=2; if(p==7) q-=1; if(q>0) if(q%2==1) solve(q+2),ans+=k-1,ans%=mod; else solve(q),ans+=k,solve(q+1), ans+=k-1,ans%=mod; if(a==5||a==7) ans++; if(q<=0) putchar('0'); else printf("%lld",ans); } else if(p==3) if(a!=3) if(q>3) putchar('1');else putchar('0'); else if(q>3) putchar('2');else putchar('1'); else if(a==p) putchar('1'); else putchar('0'); }
最后,国际惯例,thankyou for your attention
- 1
信息
- ID
- 2913
- 时间
- 100ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者