【题解】妞妞的三个盒子

题目背景

妞妞在公园里游玩时捡到了很多小球,而且每个球都不一样。妞妞找遍了全身只发现了 \(3\) 个一模一样的盒子。她打算把这些小球都装进盒子里(盒子可以为空)。她想知道她总共有多少种放法。

问题描述

\(N\) 个不同的球放到3个相同的盒子里,求放球的方案总数 \(M\) 。 结果可能很大,我们仅要求输出 \(M\bmod K\)的结果。 现在,妞妞已经统计出了 \(N\le10\) 的所有情况。见下表:

N M
1 1
2 2
3 5
4 14
5 41
6 122
7 365
8 1094
9 3284
10 9842

输入格式

两个整数 \(N\) , \(K\)\(N\) 表示球的个数。

输出格式

输出仅包括一行,一个整数 \(M \bmod K\)

样例

输入样例
11 10000
输出样例
9525

数据范围与提示

对于 \(40\%\) 数据, \(10\le N\le10,000\) ; 对于 \(100\%\)数据, \(10\le N\le 10^9\)\(K\le100000\)

蒟蒻专属——找规律!
小心翼翼地,把表格的第二栏乘 \(2\) ~

N M'
1 2
2 4
3 10
4 28
5 82
6 244
7 730
8 2188
9 6568
10 19684

再不动声色,减一个 \(1\)~

N M''
1 1
2 3
3 9
4 27
5 81
6 243
7 729
8 2187
9 6567
10 19683

我们发现,\(M''=3^{N-1}\),而 \(M=(M''+1)\div2\) ,也就是说,\(M=(3^{N-1}+1)\div 2\) !
这不就好求了嘛。
可恨的是,这辣鸡题目居然还要取模!
你说你出道题,别人好不容易把规律找出来了,你还让别人重学数论!
(╯>皿<)╯((( ┷━━━┷ 掀桌

在无数次 \(BDFS\) 后,我们 \(search\) 到了下面这个公式:

\[(a\div b)\bmod m=(a\bmod(b\times m))\div b \]

那么,我们可以得到:

\[M=((3^{N-1}+1)\bmod(2\times m))\div 2 \]

斯国一!那么接下来。。。

Code
#include<cstdio>
typedef long long ll;
ll n,mod,ans;
ll ksm(ll ds,ll zs){
	ll ans=1;
	while(zs){
		if(zs&1)ans=ans*ds%mod;
		ds=ds*ds%mod;
		zs>>=1;
	}
	return ans;
}
int main(){
	freopen("bags.in","r",stdin);
	freopen("bags.out","w",stdout);
	scanf("%lld%lld",&n,&mod);
	mod<<=1;
	ans=ksm(3,n-1)%mod;
	printf("%lld",(((ans+1)%mod)>>1)%mod);
	return 0;
}

end.

posted @ 2020-11-13 19:42  XSC062  阅读(85)  评论(0编辑  收藏  举报