题解: P9416 [POI 2021/2022 R1] Domino
lailai0916 · · 题解
解题思路
考虑使用
如图,有两种填充方式:一个纵向方块或两个横向方块。
若某列中,上下两行的填充方式不一致,会导致两侧剩余奇数个格子,无法完全填满。
这两种填充方式分别覆盖了
我们可以占用若干列格子(障碍),将整个矩形划分为若干个矩形部分。根据乘法原理,总方案数
为什么
原问题等价为:将正整数
由于
参考代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int N=90;
ll f[N],ans=inf;
void init()
{
f[0]=f[1]=1;
for(int i=2;i<N;i++)f[i]=f[i-1]+f[i-2];
}
void dfs(ll x,ll s)
{
if(x<=1)
{
ans=min(ans,s);
return;
}
if(ans<s)return;
for(int i=2;i<N;i++)
{
if(x%f[i])continue;
ll u=x,v=s;
while(u%f[i]==0)
{
u/=f[i];
v+=i+1;
}
dfs(u,v);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
ll m;
cin>>m;
dfs(m,0);
if(m==1)cout<<1<<'\n';
else if(ans==inf)cout<<"NIE"<<'\n';
else cout<<ans-1<<'\n';
return 0;
}