首页 > 其他分享 >CF468E Permanent 题解

CF468E Permanent 题解

时间:2023-01-29 14:58:16浏览次数:45  
标签:int 题解 bl CF468E 60 read Permanent cb fac

考虑暴力状压 DP。

按行 DP,记录列哪些被选过,可以做到 \(O(2^kk^2)\)。

注意到某一列扫完了之后这一列选没选过不重要,可以减少这里的状态。

简单优化一下,每次选择最少的一列,使这一列一定被减少一。

然后就可以过了,卡不满。

Code
const int N=1e5+5,mod=1e9+7;
int x[60],y[60],a[60],b[60],v[60],val[60][60],fac[N];
int ca[60],cb[60];
unordered_map<ll,int> f[60],g[60];
int main() {
    int n=read(),k=read();
    FOR(i,1,k) a[i]=x[i]=read(),b[i]=y[i]=read(),v[i]=(0ll+mod+read()-1)%mod;
    fac[0]=1;
    FOR(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
    sort(a+1,a+k+1),sort(b+1,b+k+1);
    int al=unique(a+1,a+k+1)-a-1,bl=unique(b+1,b+k+1)-b-1;
    FOR(i,1,al) FOR(j,1,bl) val[i][j]=-1;
    FOR(i,1,k) {
        x[i]=lower_bound(a+1,a+al+1,x[i])-a;
        y[i]=lower_bound(b+1,b+bl+1,y[i])-b;
        val[x[i]][y[i]]=v[i],ca[x[i]]++,cb[y[i]]++;
    }
    f[0][0]=1;
    while(1) {
        int id=0;
        FOR(i,1,bl) if(cb[i]&&(id==0||cb[i]<cb[id])) id=i;
        if(id==0) break;
        FOR(i,1,al) if(val[i][id]!=-1&&ca[i]) {
            ca[i]=0;
            vi S;
            ll all=((1ll<<k)-1)<<1;
            FOR(j,1,bl) if(val[i][j]!=-1) {
                S.pb(j),cb[j]--;
                if(cb[j]==0) all^=(1ll<<j);
            }
            FOR(j,0,k) for(auto u:f[j]) {
                g[j][u.fi&all]=(g[j][u.fi&all]+u.se)%mod;
                for(int l:S) if(!(u.fi&(1ll<<l)))
                    g[j+1][(u.fi|(1ll<<l))&all]=(g[j+1][(u.fi|(1ll<<l))&all]+
                                                1ll*u.se*val[i][l]%mod)%mod;
            }
            FOR(j,0,k) swap(f[j],g[j]),g[j].clear();
        }
    }
    int ans=0;
    FOR(i,0,k) for(auto u:f[i]) ans=(ans+1ll*fac[n-i]*u.se%mod)%mod;
    printf("%d\n",ans);
}

标签:int,题解,bl,CF468E,60,read,Permanent,cb,fac
From: https://www.cnblogs.com/cnyzz/p/17072638.html

相关文章

  • CF1033E 题解
    题意传送门交互题,给定一个简单连通图,你可以询问一个点集\(s\),返回其导出子图的边数。判断此图是否为二分图:若是,输出其中一部点的集合;否则输出任一个奇环。最多询问\(20......
  • Good Bye 2022 简要题解
    从这里开始比赛目录过气选手留下了只会套路的眼泪。sad......ProblemA KoxiaandWhiteboards相信大家都会.jpgCode#include<bits/stdc++.h>using......
  • 题解:【CF226D】The table
    题目链接调整构造。发现\(n\)和\(m\)较小只有\(100\),因此可以考虑尝试进行修改从而不断逼近答案。容易发现如果将某一行或列上的数字翻转,那么得到的新的和一定与原......
  • 【题解】ABC287
    \(\text{AtCoderBeginnerContest287}\)AMajority无意义题,问同意的是不是占半数以上。BPostalCard无意义题,对一个字符串集合开桶,对应匹配另一个字符串集合。CPa......
  • P3070 [USACO13JAN]Island Travels G 题解
    题目传送门一道耗费了本蒟蒻与某机房卷王半天的恶心题题目描述给定一个图,求每个X连通块之间的最短Hamilton路径。假如您不知道Hamilton路径是什么分析这题本质......
  • 【题解】P4491 [HAOI2018]染色
    思路NTT优化二项式反演。首先考虑到求“正好有\(k\)种颜色出现\(S\)次”的方案数,所以可以考虑转化成求“至少有\(k\)种颜色出现\(S\)次”的方案数。形式化......
  • ABC 287 (E-Ex) 题解
    E我的做法对于每个串枚举他的答案,然后直接hash硬干就完了。卡一卡就过去了#include<bits/stdc++.h>usingnamespacestd;typedefunsignedlonglongull;const......
  • setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapsh
    setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapshots带有时间错问题解决方案nexus3.8私有仓库https://blog.csdn.net/Michaelwubo/a......
  • [CF380C] Sereja and Brackets 题解
    [CF380C]SerejaandBrackets题解给定一个括号串\(s\)与\(m\)次询问。l,r回答字符串\(t=s_ls_{l+1}\dotss_r\)​的所有子序列中最长的合法括号串的长度。......
  • 【题解】[ABC286C] Rotate and Palindrome 题解
    更好的阅读体验洛谷题目传送门|AT原题传送门思路观察题目可以发现A操作最多只能执行\(n\)次,超过以后字符串又会回到初始状态。首先考虑A操作如何实现,一种办法......