CF2112E
考虑 dp。设 \(f_i\) 表示恰好有 \(i\) 种染色方案所需的最少点数,根据乘法原理,若 \(i \mid j\),则 \(f_j \leftarrow \min f_{\frac{j}{i}}+ f_{i-2}\)(由于是由两棵数合并为一棵树,故其中的一个树根不再要求为绿色,可以变为黄色或蓝色,原来整棵树也随之变化,产生了 \(2\) 种新方案,故右边是 \(f_{i-2}\) 而不是 \(f_i\))。
注意 \(i\) 为偶数时是无解的。可以这样理解,已知 \(f_1=1\) 为奇数,根据上面的分析,新产生的总方案数总是为偶数。又由于所有的情况都是由 \(f_1\) 推来的,故染色方案数一定为奇数,即偶数无解。
时间上为调和级数复杂度 \(O(N\log N+T)\),其中 \(N=5\times 10^5\)。
#include<iostream>
#include<cstdio>
#define N 500000
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
int n,f[N+10];
signed main(){
for(int i=2;i<=N;i++)
f[i]=inf;
f[1]=1;
for(int i=2;i<=N;i++){
for(int j=i;j<=N;j+=i)
f[j]=min(f[j],f[j/i]+f[i-2]);
}
int T;
cin>>T;
while(T--){
cin>>n;
if(n&1)cout<<f[n]<<'\n';
else cout<<-1<<'\n';
}
return 0;
}

浙公网安备 33010602011771号