首页 > 其他分享 >Luogu2167 Bill的挑战 - 容斥 - dp -

Luogu2167 Bill的挑战 - 容斥 - dp -

时间:2022-10-11 21:14:10浏览次数:105  
标签:int Bill 容斥 55 Luogu2167 include dp

题目链接:https://www.luogu.com.cn/problem/P2167

题解:
摘录一段描述容斥题目的话:

本题中,

关于容斥系数,可以先感性理解一下,严格证明可以用
image
即除了自身,自身的超集都计算了0次,自身计算了一次
这样可以写出image

答案就是对所有大小为k的集合image

\(q(S)\)很好算,对S中的限制满足之后,如果S中的元素对应位置都是?的话就可以直接*26了,不用管其它位置(这样就是至少为k,符合q的定义)

总结一下,容斥就是用一些比较宽的限制来取代严格的限制方便统计答案,例如用>=k求解==k

// by SkyRainWind
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define pii pair<int,int>

using namespace std;

typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, mod = 1000003;

char s[55][55];
int C[105][105],n,k;

int popc(int x){
	int r = 0;
	while(x){r += x&1;x >>= 1;}
	return r;
}

void upd(int &x,int y){(x += y) %= mod;}

int vis[25], len, oc[505];
int calc(int S){
	for(int i=1;i<=len;i++)oc[i] = 0;
	for(int i=1;i<=n;i++){
		if(S & (1<<(i-1))){
			for(int j=1;j<=len;j++){
				if(s[i][j] == '?')continue;
				if(oc[j] && oc[j] != (int)s[i][j])return 0;
				oc[j] = (int)s[i][j];
			}
		}
	}
	int r = 1;
	for(int i=1;i<=len;i++)
		if(!oc[i])r = r * 26ll % mod;
	return r;
}

void solve(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)scanf("%s",s[i] + 1);
	len = strlen(s[1] + 1);
	int res = 0;
	for(int S = 0; S<=(1<<n) -1 ;S++){
		int pc = popc(S);
		if(pc < k)continue;
		int fc = ((pc-k) & 1) ? -1 : 1;
		upd(res, 1ll * calc(S) * fc * C[pc][k] % mod);
		res = (mod + res) % mod; 
	}
	printf("%d\n",res);
}

signed main(){
	C[0][0] = 1;
	for(int i=1;i<=100;i++){
		C[i][0] = 1;
		for(int j=1;j<=i;j++)
			C[i][j] = (C[i-1][j] + C[i-1][j-1]) % mod;
	}
	int te;scanf("%d",&te);
	while(te --)solve();

	return 0;
}

标签:int,Bill,容斥,55,Luogu2167,include,dp
From: https://www.cnblogs.com/SkyRainWind/p/16782559.html

相关文章

  • dp 记录
    感觉自己dp不行,打算先专门练一阵子dp。以下是从国庆开始的训练实录。会根据我自己水平定个难度。\(\rmEasy\):独立想出并用时短。\(\rmMiddle\):独立想出并用时长......
  • wordpress 开发相关函数
    首页判断is_home()is_front_page()当你的首页不是默认的index.php的时候,而是在后台指定了一个page页面。这种情况下is_home()会失效,也就是说这样子的情况下就不能再用is......
  • 【洛谷】P8256 [NOI Online 2022 入门组] 字符串(dp)
    原题链接题意给定两个由0,1,-组成的字符串\(S\),\(T\),以及一个空串\(R\)。\(S\)的长度为\(n\)。现在要进行\(n\)次操作,每一次操作取出\(S\)的第一个字符\(c\)......
  • Java线程池 ThreadPoolExecutor 深入解析 任务列队,拒绝策略,自定义线程池工厂,线程池扩
    目录​​相关文章​​​​介绍   ​​​​ThreadPoolExecutor构造方法​​​​构造函数的参数含义如下​​​​各项介绍​​​​workQueue任务队列​​​​1.直接提交......
  • wordpress wp_insert_post插入文章iframe被自动过滤iframe无法插入iframe消失
    add_filter('wp_kses_allowed_html','esw_author_cap_filter',1,1);functionesw_author_cap_filter($allowedposttags){ if(!current_user_can('publish_posts'......
  • LcdTools如何通过PX01把EDP屏的EDID拷贝出来
    PX01点EDP屏在上电过程会自动读取屏EDID,怎么把EDPEDID值拷贝出来呢?在上电时序函数调用SetEdidRdShowEn(ON)指令开启EDID值读取显示功能。如下图  ......
  • 洛谷 P2766【网络流】【线性DP】
    摘自网络流\(24\)题官方题解。第一问:直接\(O(n^2)\)DP求解最长不下降子序列即可。第二问:使用类似于酒店之王的思想,将点\(i\)拆成两个点\(i_1\),\(i_2\)。然后......
  • linux包管理器rpm和dpkg的使用说明
    软件包:开源软件刚开始只提供打包好的源代码文件(例如:.tar.gz),用户需要自己使用编译器编译后才能使用。Debian诞生时,管理工具dpkg也就应运而生,可用来管理deb后缀的"包"......
  • Optimal Partition (线段树优化DP)
    给定一个数组 a,(1≤n≤5×105),你需要将其分割为若干个连续的子数组,使所有子数组的价值总和最大。定义价值是:r-l+1,和>00,和=0-(r−l+1),和<0;思路:首先这道题初......
  • 矩阵类优化——动态dp
    Idea主要指用矩阵维护带修改的dp问题的方法,一般会用到数据结构来维护矩阵。矩阵的用法具体见矩阵加速优化dp.下面主要根据例题讲解。Problem1.P4719【模板】"......