zoukankan      html  css  js  c++  java
  • [codechef] Counting D-sets(容斥原理)

    Problem

    题目地址

    Solution

    首先做一步转换,强制所有的点向坐标轴平移,这样对于每一维至少有一个点该维的坐标是 (0)(以下简述为:每一维至少一个 (0)。)

    这样一个点集的直径就是这个点集每一维每个点该维最大坐标的最大值。

    对于恰好这个条件,不好求。可以转化为设 (f(D)) 为直径 (le D) 的点集数量,则直径恰好为 (D) 的点集数为 (f(D)-f(D-1))

    对于(f(D)),合法的方案应该满足:

    • 1.每个点每一维的坐标在 ([0,D])

    • 2.每一维至少一个 (0)

    第一个限制很好解决,第二的限制考虑容斥。去掉第二个条件,全集为 (2^{(D+1)^n})。考虑限制2 的不合法方案,应该为至少有一维全部无 (0),这个还是用容斥来数,强制有一维全部无 (0),由于会数重复,以此类推,具体的,限制2 的不合法方案数为:

    [sum_{i=1}^n (-1)^{i-1} dbinom{n}{i} 2^{D^i(D+1)^{n-i}} ]

    综上,总合法方案数为:

    [f(D)=2^{(D+1)^n}-sum_{i=1}^n (-1)^{i-1} dbinom{n}{i} 2^{D^i(D+1)^{n-i}} ]

    时间复杂度 (O(T log n))

    Code

    Talk is cheap.Show me the code.

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    inline int read() {
        int x = 0, f = 1; char ch = getchar();
        while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
        return x * f;
    }
    const int N = 1007, mod = 1000000007;
    int n,D;
    int jc[N];
    int Pow(int x,int y,int qmod) {
    	int res = 1, base = x;
    	while(y) {
    		if(y&1) res = res*base%qmod; base = base*base%qmod; y >>= 1;
    	}
    	return res;
    }
    int Inv(int x) {
    	return Pow(x,mod-2,mod);
    }
    int Calc(int x,int y) {
    	return jc[x]*Inv(jc[y]*jc[x-y]%mod)%mod;
    }
    int f(int d) {
    	int U = Pow(2,Pow(d+1,n,mod-1),mod), C = 0;
    	for(int i=1;i<=n;++i) {
    		C = (C + (i&1 ? 1 : -1)*Calc(n,i)*Pow(2,Pow(d,i,mod-1)*Pow(d+1,n-i,mod-1)%(mod-1),mod)%mod + mod)%mod;
    	}
    	return (U - C + mod) % mod;
    }
    void work() {
    	n = read(), D = read();
    	printf("%lld
    ",(f(D)-f(D-1)+mod)%mod);
    }
    void Init() {
    	jc[0] = 1;
    	for(int i=1;i<N;++i) jc[i] = (jc[i-1] * i) % mod;
    }
    signed main()
    {
    	Init();
    	int T = read();
    	while(T--) work();
        return 0;
    }
    /*
    5
    1 10
    2 1
    2 10
    3 1
    3 3
    
    512
    9
    498134775
    217
    548890725
    */
    

    Summary

    容斥原理。

  • 相关阅读:
    【作业四】软件案例分析之必应词典
    【番外篇001】意外的“黄马褂”
    收藏的好资源
    【作业三】结队任务二-----CourseManagement
    【作业二】结对项目之需求分析与原型模型设计
    【实践练习一】Git以及Github的使用
    [iOS 多线程 & 网络
    Objective-c 单例设计模式
    优化tableView性能(针对滑动时出现卡的现象)
    iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  • 原文地址:https://www.cnblogs.com/BaseAI/p/14028358.html
Copyright © 2011-2022 走看看