Loading

CF1924C

发现这个东西有一种隐隐约约的递推藏在里面,然后发现确实是递推。

具体的,我们注意到一个正方形先进行第一次折,我们发现实际上它分成了 4 个小正方形,这四个小正方形是互相独立的,然后折完一次后它们都变成了一个三角形,我们试着分析每个三角形在后一次是怎么折的,发现折完以后还会是一个小三角形。

于是我们设 fi 表示已经折完 n 次后展开 i 次的每个小三角形(或第一次折之前的小正方形)的凹痕长度和, gi 则表示凸痕长度和,然后考虑转移。

首先,转移其实就是想象它折完之后再打开的过程,于是我们可以推出:

fi=fi1+gi12+1

gi=fi1+gi12

发现 fi=gi+1,那么最后要求的 MV 就是 gngn+1=11gn+1,由于我们只关心最后求出的 b,所以只计算 1gn+1 就行了。

然后我们考虑把 fi 像虚数一样表示成 x+y2gi 同理,至于怎么求我想到了两种方法:

1.矩阵乘法,直接转移即可。

2.继续推式子,根据这个上面关于 gi 的两个式子还可以得到 gi=2×gi1+22,对于这种 gi=k×gi1+w 可以转换成另一种形式,hi=gi+v,hi=k×hi1,解个方程发现有 hi=gi+1+22,hi=2×hi1,其中 h1=1+22,然后就有 gn+1=(1+22)2n122,简化一下:

1gn+1=12n12+2n22212

最后分类讨论 n 的奇偶性求出 xy,然后分母有理化就可以求出 b 了。

代码:

void solve ()
{
	int n = rd ();
	if (n & 1)
	{
		int x = qpow (2, (n + 1) >> 1);
		int y = 1 - qpow (2, (n - 1) >> 1);
	} else
	{
		int x = qpow (2, n >> 1);
		int y = 1 - x;
	}
	printf ("%lld\n", ((- 2 * y * qpow ((x * x - y * y * 2) % P, P - 2)) % P + P) % P);
}

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18031663

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示