首页 > 其他分享 >【atcoder】习题——位元枚举

【atcoder】习题——位元枚举

时间:2024-07-12 10:57:39浏览次数:16  
标签:atcoder 位元 10 int ll cin len 习题 MOD

题意:求i&M的popcount的和,i属于0……N

主要思路还是变加为乘。

举个例子N=22,即10110

假设M的第3位是1,分析N中:

00110

00111

00100

00101

发现其实等价于

0010

0011

0000

0001

也就是左边第4位和第5位不变,右边第1位和第2位不变拼接起来,相当于0000~0011

01110

01111

01100

01101

等价于:

0110

0111

0100

0101

相当于0100~0111

10110

10111

10100

10101

相当于1000~1010

最后把3个部分合一起就是0000~1010

如果M的第3位是0,比如说10010(二进制),其实等价于求01110这个二进制数

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
ll ans,n,m;
int main(){
	cin>>n>>m;
	for(int i=0;i<60;i++){
		if((m>>i)&1){
			ll mask=(1ll<<i)-1;
			if((n>>i)&1){
				ll tmp=(n>>(i+1)<<i)|(n&mask);//左边拼接上右边
				ans=(ans+tmp+1)%mod;
			}	
			else {
				ll t=(n-(1ll<<i))|mask;//先把n更新一下,注意要把右边变成最大值
				ll tmp=(t>>(i+1)<<i)|(t&mask);//同样处理
				ans=(ans+tmp+1)%mod;
			}
		}
	}
	cout<<ans;
}

题意:共n把钥匙m次测试,至少k把钥匙才打开门,问满足所有测试条件的真钥匙的组合种类

位元枚举:用位元表示所有真钥匙的组合,然后保存每个测试的钥匙状态,满足所有测试就是答案组合

#include <bits/stdc++.h>
using namespace std;
int keys[20];
char r[105];
int f(int x){
	int ct=0;
	while(x){
		if(x&1)ct++;x>>=1;
	}
	return ct;
}
int main(){
	int n,m,k;cin>>n>>m>>k;//n把钥匙,m个测试,至少k把钥匙才能打开门
	for(int i=0;i<m;i++){
		int c;cin>>c;
		while(c--){
			int a;cin>>a;
			keys[i]|=1<<(a-1);//把i测试用的钥匙存起来
		}
		cin>>r[i];//最终门的状态
	}
	int ans=0;
	for(int s=0;s<(1<<n);s++){//枚举所有正确钥匙的组合情况
		bool er=0;
		for(int i=0;i<m;i++){//看看是否满足所有的测试用例
			if((f(keys[i]&s)>=k&&r[i]!='o')||(f(keys[i]&s)<k&&r[i]=='o')){
				er=1;break;
			}
		}
		ans+=!er;
	}cout<<ans;
}

不难发现:10101010101010101010 = 10*(1010101010101010101)

就是10*(10^0+10^2+10^4+10^6+10^8+10^10+10^12+10^14+10^16+10^18) 进行等比求和:

10*(10^20-1)/(10^2-1)

那么输入一个N,我们计算出其长度len

就是:N*(10^0+10^len+10^len*2+10^len*3+……+10^len*n-1)

就是N*(10^len*n)/(10^len-1)

然后知识点:a/b%mod=a*b^(mod-2)%mod

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=998244353;
ll f(ll x,ll y){
	x%=MOD;
	ll res=1;
	while(y){
		if(y&1)res=res*x%MOD;
		y>>=1;x=x*x%MOD;
	}
	return res;
}
ll inv(ll x){
	return f(x,MOD-2);
}
int main(){
	ll n;cin>>n;
	int len=(to_string(n)).size();
	cout<<n%MOD * (f(f(10,n),len)-1)%MOD * inv(f(10,len)-1)%MOD<<'\n';
}

题意:一共有n个店,每个店有许多口味,问能尝到所有口味至少要去多少家店

位元枚举:用位元来表示所有店的组合,并保存每个店提供的口味状态,如果某个组合中可提供所有的口味就行

#include <bits/stdc++.h>
using namespace std;
int d[10];
int main(){
	int n,m;
	cin>>n>>m;//n个店,m种口味
	for(int i=0;i<n;i++){
		string s;cin>>s;
		for(char c:s){
			d[i]=(d[i]<<1)+(c=='o');//保存第i个店卖的口味状态
		}
	}
	int an=100;
	for(int i=0;i<(1<<n);i++){//枚举所有的店的组合
		int now=0,cnt=0;
		for(int j=0;j<n;j++){
			if((i>>j)&1)now|=d[j],cnt++;//把组合中的每个店卖的东西都合并起来
		}
		if(now==(1<<m)-1)an=min(an,cnt);//如果当好覆盖了所有口味,那就更新一次答案
	}
	cout<<an;
}

标签:atcoder,位元,10,int,ll,cin,len,习题,MOD
From: https://blog.csdn.net/m0_69478376/article/details/140069619

相关文章

  • 数据挖掘习题9
    1.题干    AQIandLatLongofCountries.csv数据集的目标是为不同地区的空气质量提供有价值的见解,使研究人员和政策制定者能够就如何解决空气污染问题做出明智的决定。该数据集由两个独立的数据集合并而成,一个包含城市及其相应的经纬度坐标信息,另一个包含世界各国的......
  • 云计算练习题
    第一题:每周日晚上11点59分需要将/data目录打包压缩到/mnt目录下并以时间命名#crontab-e5923**7/bin/tarczvf/mnt/`date+%F`-data.tar.gz/data5923**7/bin/tarczvf/mnt/`date+%T`.tar.gz/data第二题:查找出系统中/application目录下所有tar.gz的文件并......
  • 【C++修行之道】string类练习题
    目录387.字符串中的第一个唯一字符125.验证回文串 917.仅仅反转字母415.字符串相加(重点)541.反转字符串II387.字符串中的第一个唯一字符字符串中的第一个唯一字符-力扣(LeetCode)给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引 。如果不存......
  • 衡庐浅析·C语言程序设计·第二章·运算符及其优先级关系(练习题一)
        本文适用于大学的期中期末考试、专升本(专接本、专插本)考试、408等考研预科。如有相关题目疑问或建议欢迎在评论区进行互动。    转载请标明出处。不知道大家有没有消化完第二章的内容。在这里我们将列出一些关于运算符及其优先级关系的课后练习题,方便大家......
  • 浙大数据结构慕课课后习题(02-线性结构2 一元多项式的乘法与加法运算)
    题目要求设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项......
  • 研0 冲刺算法竞赛 day14 P1957 口算练习题
    思路:分别考虑以运算符或数字开头,为运算符,直接读入后面两个数字;为数字,在读入一个数字即可代码:#include<iostream>#include<cstring>#include<cstdio>usingnamespacestd;intmain(){ intN; cin>>N; charc[10],str[55],f; while(N--) { cin>>c; int......
  • Solution - Atcoder ABC177F I hate Shortest Path Problem
    考虑按题目所述的进行DP。设计状态\(f_{i,j}\)代表强制要求\((i,j)\)要走向\((i+1,j)\)最小的横坐标之差,这是因为对应的纵坐标之差是确定的。对于转移,考虑到对于\(j\not\in[a_i,b_i]\),直接从上面转移下来即可,即\(f_{i,j}\leftarrowf_{i-1,j}\)。对于\(j......
  • [CSAWQual 2019]Web_Unagi XXE漏洞练习题
    题目地址:BUUCTF在线评测这道题就是简单的xxe漏洞的注入。进来之后我们进行一个信息收集,在upload下可以看到有个here的超链接。点进去之后得到了如下的一些信息。可以猜到是需要我们利用文件上传包含xxe漏洞利用来得到flag。<?xmlversion='1.0'?><!DOCTYPEusers[<!ENT......
  • Python——习题练习 part3 函数进阶
    本篇文章记录函数进阶部分的知识点及例题代码。目录六,函数进阶01 函数的多返回值02函数的传参方式 1,位置参数2,关键字参数3,缺省参数4,不定长参数a,位置传递b,关键字传递03lambda匿名函数六,函数进阶01 函数的多返回值#函数的多返回值deftest_return():......
  • Solution - Atcoder ARC150D Removing Gacha
    考虑到每次操作都比定会选上一个点,于是答案可以表示为每个点被选中的次数之和。即令\(c_i\)为\(i\)点被选中的次数,答案即为\(E(\sum\limits_{i=1}^nc_i)\)。根据期望的线性性,考虑把答案的\(E\)拆到每个\(c_i\)上,即变为\(\sum\limits_{i=1}^nE(c_i)\)的形式。......