【题解】妞妞的三个盒子
题目背景
妞妞在公园里游玩时捡到了很多小球,而且每个球都不一样。妞妞找遍了全身只发现了 \(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.
—— · EOF · ——
真的什么也不剩啦 😖