CF1225G To Make 1

Link
\(a_i\)总共除过\(b_i\)次,那么我们要做的就是找到一组\(b\)使得\(\sum\limits_{i=0}^na_ik^{-b_i}=1\)
显然存在合法的\(b\)就存在一组合法的合并方案,具体的求解可以dfs。
考虑状压dp,设\(f_{s,x}\)表示存在一组\(b\)使得\(\sum\limits_{i\in s}a_ik^{-b_i}=x\)
转移非常简单就不讲了,注意到复杂度是\(O(2^nnk)\)会爆炸,用bitset优化即可做到\(O(\frac{2^nnk}{\omega})\)

#include
#include
#include
#include
#define se second
const int N=2007,M=65537;
using std::pair;
using pi=pair;
int a[16],c[16],low[M],n,k,U,s;
std::bitsetf[M];
std::priority_queueq;
int read(){int x;scanf("%d",&x);return x;}
void dfs(int st,int x)
{
    if(!st) return;
    for(;x*k<=s&&f[st][x*k];x*=k) for(int i=0;i>i&1) ++c[i];
    for(int i=0;i>i&1&&x>=a[i]&&f[st^1<>j&1) f[i]|=f[i^1<1;)
    {
    u=q.top(),q.pop(),v=q.top(),q.pop(),printf("%d %d\n",u.se,v.se),u.se+=v.se;
    while(!(u.se%k)) u.se/=k,--u.first;
    q.push(u);
    }

}

你可能感兴趣的:(CF1225G To Make 1)