zoukankan      html  css  js  c++  java
  • hdu6314( 2018 Multi-University Training Contest 2)

    bryce1010模板

    http://acm.hdu.edu.cn/showproblem.php?pid=6314

    …………. 又是一个数学题!
    这个题使用容斥原理解决的,现场看dls推公式。
    我也推了一遍:

    f[n][m]=sum { r=0...n,c=0....m }   
    =C(n,r)*C(m,c)*(-1)^(c+r)*2^((n-r)*(m-c))
    
    列举至少a行b列的情况
    f[n][m]=sum{u=a...n,x=b...m}*sum{v=0...n-u,y=0...m-x}
    =C(n,u)*C(m,x)*f[n-u][m-x]
    
    把公式扩展
    =C(n,u)*C(m,x)*C(n-u,v)*C(m-x,y)*(-1)^(v+y)*2^((n-u-v)*(m-x-y))
    
    令w=n-u-v  z=m-x-y
    上面的式子扩展二项式后:
    =n!m!/u!/x!/y!/v!/w!/z!*(-1)^(v+y)*2^(w*z)
    
    多项式归类:
    =(-1)^v/u!/v! *  (-1)^y/x!/y!   *2^(w*z)/w!/z!
    
    编程的时候可以预处理一个pre[s][a]    u+v=s;u>=a;表示它的(-1)^v/u!/v!
    又u+v=n-w   x+y=z-m
    =pre[n-w][a]*pre[z-m][b]*2^(w*z)/w!/z!
    
    
    

    反正推理过程比较无聊,而且非常耗费时间

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,n) for (int i=a;i<n;i++)
    #define per(i,a,n) for (int i=n-1;i>=a;i--)
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef vector<int> VI;
    typedef long long ll;
    typedef pair<int,int> PII;
    const ll mod=998244353;
    ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
    // head
    
    const int N=3010;
    ll fac[N],fnv[N];
    int pw[9000100];
    int gg[3010][3010];
    ll f[3010][3010];
    int n,m,a,b;
    int main() {
        fac[0]=fnv[0]=1;
        rep(i,1,3001) fac[i]=fac[i-1]*i%mod,fnv[i]=powmod(fac[i],mod-2);
        pw[0]=1;
        for (int i=1;i<=9000000;i++) pw[i]=pw[i-1]*2%mod;
        for (int w=0;w<=3000;w++) for (int z=0;z<=3000;z++) gg[w][z]=pw[w*z]*fnv[w]%mod*fnv[z]%mod;
        for (int s=0;s<=3001;s++) {
            for (int u=s;u>=0;u--) {
                int val=fnv[u]*fnv[s-u]%mod;
                if ((s-u)%2) val=mod-val;
                f[s][u]=(f[s][u+1]+val)%mod;
            }
        }
        while (scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF) {
            ll ans=0;
            rep(w,0,n-a+1) rep(z,0,m-b+1) ans=(ans+f[n-w][a]*f[m-z][b]%mod*gg[w][z])%mod;
            printf("%lld
    ",ans*fac[n]%mod*fac[m]%mod);
        }
    }
  • 相关阅读:
    编码问题,编码到吐血
    dz验证码
    奇葩之mysql【四】找不到表了
    EntityFramework 使用Mysql数据库
    Create a custom output cache prodiver in asp.net4
    WPF一个很炫的控件
    yield grammar
    最大公约数的故事
    新人
    学习笔记 简单的amob A%B Problem
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386834.html
Copyright © 2011-2022 走看看