[洛谷P5023][题解]填数游戏

0.一些东西

原题NOIp2018
毒瘤找规律差评

1.解法

这道题数据较小,可以暴力打表找规律(没打)。
当然正解是数学推导,我们接下来大致讲一下思路。
注:下文中“对角线”均指左下-右上(副对角线)。
首先给出两个引理及简略证明:
引理1:任一对角线从左下到右上填数单调不增。
证明很简单,照题意模拟即可,此处不再赘述。
引理2:若((x,y-1))((x-1,y))填数相同,则以((x,y))为左上角的矩形每条对角线上填数分别相同。
证:可运用反证法,设在对应矩形(红框)中出现了对角线上填数不等的情况,
引理2
蓝色与黄色路径即不满足题意,证毕。
设最终答案为(ans(n,m))
于是我们通过打表可得:
1.(ans(n,m)=ans(m,n))
证:将(n imes m)的矩形和填的数都反过来,可以理解为将每条路径的(w)(s)均反过来,结果显然不变。
2.(ans(n,m+1)=3 imes ans(n,m))
证明留作练习。(其实是我也不会证,以后补上这里)

由于有了两个引理中的限制,我们可以手玩每种情况,算出答案。
情况1:(n=m),此时有如下几种情况。
1
答案为(8^{n-1})
2
答案为(5 imes 2^{3n-7})
3
这种情况不太好办,我们发现左边的两列不确定性太大,不能直接计算。
但是我们可以枚举!方式为枚举到哪条绿线出现了相同填数。
这样我们就可以算出这种情况的答案,做一个等比数列求和即可得到答案。
(不写了不写了)
4
与上面是完全对称的,可以直接套用。

此时就可以推出(ans(n,n))了。(累死了直接放结果)
(frac{83 imes8^n+5 imes2^{n+7}}{384})
(ans(n,n+1))同理,(frac{83 imes8^{n}+2^{n+8}}{128})

此时请注意,我们刚刚推的都是(nge4)的情况,其余情况如下:
(n=1,ans(1,m)=2^m;)
(n=2,ans(2,m)=4 imes3^{m-1};)
(n=3,ans(3,m)=112 imes3^{m-3};)
这样就可以推出任意(ans(n,m))了。

2.代码

#define mod 1000000007
int n,m;
inline int pw(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod,b>>=1;
	}
	return ans;
}
signed main(){
	Read(n),Read(m);
	if(n>m)swap(n,m);
	if(n==1)cout<<pw(2,m)<<endl;
	else if(n==2)cout<<4*pw(3,m-1)%mod<<endl;
	else if(n==3)cout<<112*pw(3,m-3)%mod<<endl;
	else {
		if(m==n)cout<<(83*pw(8,n)%mod+5*pw(2,n+7)%mod)%mod*pw(384,mod-2)%mod<<endl;
		else cout<<pw(3,m-n-1)*(83*pw(8,n)%mod+pw(2,n+8))%mod*pw(128,mod-2)%mod<<endl;
	}
	return 0;
}

3.完结撒花

原文地址:https://www.cnblogs.com/juruoajh/p/13697592.html