CF79D Password:

差分。两点取反,本质是匹配!最短路+状压DP

取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题。

且匹配不会影响别的位置答案

 

sequence

计算最长极长段小于等于j的方案数

突破口是i,k总共对数nlogn级别,干掉j用组合意义大力推导

 

CF1062F Upgrading Cities

DAG考虑topo,关键性质:topo序队列中点两两不可达。只在队列长度<=2时候才关心。

 

CF1060F Shrinking Tree

考虑x是不是rt,要进行讨论的。考虑e什么时候合并,也是要讨论的。

x是不是rt就成了分界点。e什么时候合并也是关键点,这样才对son的子树内序列做出了限制。也才能用上dp[son]转移。

所以状态就直接记录还剩下多少个边没有合并,这些边都要注意是否有1/2的概率限制。而且还可知道之前放入了多少边,有助于组合数分配转移。

 

CF1009G Allowed Letters

贪心,后面有无解即可。完美匹配,Hall定理

 

[THUWC2017]随机二分图

考虑每个方案的出现概率和,f[S]进行记忆化爆搜。s偶数有用,状态数<=1e8

第2/3类边,看做独立的,再额外贡献+25%或者-25%的同时选择方案的系数。

拆边转化,然后同上!

 

【模板】第二类斯特林数·列

递推式:OGF,再不断迭代

根据定义:EGF,然后快速幂,

 

LOJ#6079. 「2017 山东一轮集训 Day7」养猫

k可重区间问题 的增强版:有上下界!

直接都选择s[i],然后再把一些调整到e[i]

考虑通过最大流的“最大”,使得至少每k个有me个e,也即选择少于k个,则不能保证流量最大

通过最大流的“上界”,限制每k个最多有k-ms个e

 

CF295E aroslav and Points

考虑每段的贡献,l*a*b,直接动态开点线段树维护∑l,∑al,∑bl,∑abl,pushup即可。答案就是∑abl

(不知为啥放到了图论专题)

 

CF1054F Electric Scheme

每行每列一条线,多于交点?每行每列点与点的间隔搞出来当做点,二分图,相交就inf连边,

 

CF757F Team Rocket Rises Again

最短路DAG+支配树

 

CF786E ALT

注意审题!所有守卫都要有一个狗!

所以直接最小割。连边倍增优化一下即可。

 

CF986F Oppa Funcan Style Remastered

转化为质因子的配凑,同余最短路!特判一些情况。

 

Atcoder某比赛题

给定p=1e6+3(一个质数),q(q<=1e5)次询问,每次给定n,d,x,求$Pi_{i=0}^{n-1}(x+i\times d)$

智商题

提出$d^n$,然后就是$d^n\times Pi_{i=0}^{n-1}(\frac{x}{d}+i)$

 

Atcoder Dark Horse

晋级的比拼是一个深度为n的满二叉树,1号获胜,当且到根路径的其余2^i(0<=i<=15)的分支最小值都不能是ai

都不能其实很难保证。考虑容斥。ai从大到小排序

f[i][s],前i个ai,钦定了|s|个作为s这个集合的分支子树的最小值。转移时候,分配给若干比ai大的编号即可。

然后ans+=(-1)^|s|*f[n][s]*....进行容斥即可。

然后这个只是分组,再乘上2^n*((2^i)!)才是答案。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
    char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=1e9+7;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-2){int ret=1;while(y){if(y&1) ret=mul(x,ret);x=mul(x,x);y>>=1;}return ret;}
}
using namespace Modulo;
namespace Miracle{
const int N=17;
const int M=(1<<16)+233;
int jie[M],inv[M];
int C(int n,int m){
    if(n<0||m<0||n<m) return 0;
    return mul(jie[n],mul(inv[m],inv[n-m]));
}
int f[N][1<<16];
int n,m;
int a[N];
int sz[1<<16];
bool cmp(int x,int y){
    return x>y;
}
int main(){
    rd(n);rd(m);
    for(reg i=1;i<=m;++i) rd(a[i]);
    sort(a+1,a+m+1,cmp);
    
    jie[0]=1;
    for(reg i=1;i<=(1<<n);++i) jie[i]=mul(jie[i-1],i);
    inv[1<<n]=qm(jie[1<<n]);
    for(reg i=(1<<n)-1;i>=0;--i) inv[i]=mul(inv[i+1],i+1);

    for(reg i=0;i<(1<<n);++i){
        sz[i]=sz[i>>1]*2+(i&1);
    }
    
    f[0][0]=1;
    for(reg i=1;i<=m;++i){
        // cout<<"i "<<a[i]<<endl;
        for(reg s=0;s<(1<<n);++s){
            if(f[i-1][s]==0) continue;
            f[i][s]=ad(f[i][s],f[i-1][s]);
            for(reg p=0;p<n;++p){
                if(!((s>>p)&1)){
                    // cout<<" fang "<<s<<" and "<<p<<" : "<<mul(f[i-1][s],C((1<<n)-a[i]-sz[s],(1<<p)-1))<<endl;
                    f[i][s|(1<<p)]=ad(f[i][s|(1<<p)],mul(f[i-1][s],C((1<<n)-a[i]-sz[s],(1<<p)-1)));
                    // cout<<"go "<<(s|(1<<p))<<" "<<f[i][s|(1<<p)]<<endl;
                }
            }
        }
    }
    ll ans=0;
    for(reg s=0;s<(1<<n);++s){
        int tmp=f[m][s];
        // cout<<" s "<<s<<" tmp "<<tmp<<endl;
        int re=(1<<n)-sz[s]-1;
        for(reg p=0;p<n;++p){
            if(!((s>>p)&1)){
                tmp=mul(tmp,C(re,(1<<p)));
                re-=(1<<p);
            }
        }
        // cout<<" after "<<tmp<<endl;
        if(__builtin_popcount(s)&1){
            tmp=mod-tmp;
        }
        ans=ad(ans,tmp);
    }
    // cout<<"ans1111 "<<ans<<endl;

    ans=mul(ans,(1<<n));
    for(reg i=0;i<n;++i){
        ans=mul(ans,jie[1<<i]);
    }
    ot(ans);
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
*/
View Code

相关文章:

  • 2021-12-19
  • 2021-06-21
  • 2021-11-18
  • 2021-11-09
  • 2021-07-16
  • 2022-01-13
  • 2021-10-05
猜你喜欢
  • 2022-01-15
  • 2021-12-19
  • 2021-12-19
  • 2021-12-19
  • 2021-07-31
  • 2021-07-23
  • 2021-12-19
相关资源
相似解决方案