5.25 费解的开关

news2024/11/20 4:56:39

 

 

 

思路,枚举

开关按下两次就复原,所以一个开关只有两种情况,按下和不按下,5*5的开关,一共25个开关,一共有2^25种情况,for (int i = 0;i < 2^25;i++)进行操作,计算按下开关次数,若大于6,则跳过,否则,进行计算,判断按下后是否符合要求,符合则更新需要的最小次数,否则不更新。最后,如果最小次数大于6输出-1,否则输出最小次数。

考虑,第一行开关状态固定,能够影响到第一行的只有第二行,其他行无法影响第一行,所以,对于第一行中的第k列,如果第k列是不亮的,为了使该灯变亮,需要第二行的第k列按钮按下;这将确定第二行的所有开关的按下/不按的操作,第二行的灯状态将确定(如果再按下第二行的开关,第一行的第k列灯将会再次不亮);第三行的开关操作由第二行的灯的状态确定,第四行的开关操作由第三行的灯的状态确定,第五行的操作由第四行的灯的状态确定,第五行是最后一行,到达枚举的终点,如果第五行的灯都是亮的,说明当前枚举的开关操作是合理的,记录开关操作次数,否则说明当前枚举的开关操作不能使灯全部都亮,操作不满足要求, 更新需要的最少的开关的操作次数。最后,如果2^5种情况得到的最小开关操作次数大于6,则输出-1,否则输出操作次数。(根据这个可以提前判断,枚举每一种开关操作时,大于6则继续下一次操作,不更新最少开关次数)注意,要取min的,数组,则初始化为0x3f,memset,按字节填充,两倍不超int数据类型最大范围;数字,非常大的一个数,比如1<<32;。

过程如下:

枚举第一行开关的2^5种操作可能情况,确定第一行的灯的状态,更新开关操作次数times,

        为了使1-4行灯是亮的,确定2-5行开关的操作,更新开关操作次数times,如果times大于6,直接进入下一种情况讨论continue;,

        如果第五行的灯都是亮的,说明当前枚举的开关操作是合理的,记录开关操作次数,更行最小开关操作次数min_times

                否则说明当前枚举的开关操作不能使灯全部都亮,操作不满足要求

        如果min_times大于6,则输出-1,否则输出min_times。

代码如下

#include<iostream>

using namespace std;
const int N=6;
int n;
char m[N];
int led[N][N];
int copy1[N][N];
int dx[5]={-1,1,0,0,0},dy[5]={0,0,0,-1,1};
void print(int a[N][N]){
	for(int i = 0;i < 5;i++){
		for(int j = 0;j < 5;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
}
void copy_f(int a[N][N],int b[N][N]){
	for(int i = 0;i < 5;i++)
		for(int j = 0;j < 5;j++)
		a[i][j]=b[i][j];
}

void change(int x,int y){
	for(int i = 0;i < 5;i++)
		{
			int nx=x+dx[i],ny=y+dy[i];
			if(nx>=0&&nx<=4&&ny>=0&&ny<=4)
				if(copy1[nx][ny]==1)copy1[nx][ny]=0;
				else copy1[nx][ny]=1;
		}
}

void work(){
	int times,min_times=1<<30; //
	for(int state = 0;state < 1<<5;state++) {
		times=0;
		copy_f(copy1,led);//复制 ,下面的操作基于copy数组,不改变led数组 
		for(int i = 0;i < 5;i++)//第一行 
			if(state>>i &1){//开关操作 
				change(0,4-i);
				times++;
			}
		for(int i = 0;i < 4;i++)//根据0-3行确定1-4行操作 
			for(int j = 0; j < 5;j++)
				if(copy1[i][j]==0){
					change(i+1,j);
					times++;
				} 	
		bool flag=true;
		for(int i = 0;i < 5;i++)
			if(copy1[4][i]==0)
			{
				flag=false;
				break;
			}
		if(flag)min_times=min(min_times,times); 
	}
	
	if(min_times<=6)cout<<min_times<<endl;
	else cout<<-1<<endl;
}

int main(){
	cin>>n;
	while(n--){
		for(int i = 0;i < 5;i++){
			cin>>m;
			for(int j = 0;j < 5;j++)
				//cout<<m[j]<<" ";
				if(m[j]=='1')led[i][j]=1;
				else led[i][j]=0;
		}
		work();	
	}
	return 0;
}

第一个小错误:change(0,4-i);写为change(0,i);,实际上不影响。

改了半天才发现的小错误:

int nx=x+dx[i],ny=y+dy[i];  误写为int nx=x+dx[i],ny=y+dx[i];

约数之和

数的质因数表示,约数个数之和, 约数之和,

代码

#include<bits/stdc++.h>
using namespace std;
const int mod=9901;
int qmi(int m,int k){//logk
	//m^k % mod
	long long res=1;
	m=m%mod;
	while(k){
		if(k&1)res*=m%mod;
		res%=mod;
		m=m*m%mod;
		k>>=1;
	}
	return (int)res;
}
int sum(int p,int k){
	if(k==0)return 1;
	//if(k%2==0)return (p%mod*sum(p,k-1)+1)%mod;
	if(k%2==0)return ((1+qmi(p,(k-1)/2+1))*sum(p,(k-1)/2)%mod+qmi(p,k))%mod;
	return (1+qmi(p,k/2+1))*sum(p,k/2)%mod;
}
int main(){
	
	int A,B;
	cin>>A>>B;
	int res=1;
	for(int i = 2;i <=A;i++){
		int s=0;//i^s 
		while(A%i==0){
			s++;
			A/=i;
		}
		//cout<<"s="<<s<<" "<<endl;
		if(s)res=res*sum(i,s*B)%mod;
	}
	if(!A)res=0;
	cout<<res<<endl;
	
	//cout<<qmi(7,3);
	return 0;
}

我的qmi模板,见5.24 基础题目_wxxka的博客-CSDN博客

#include<bits/stdc++.h>
using namespace std;
const int mod=9901;
int qmi(int a,int b){
    int p = mod;
    long long res = 1,ci=1;
    int flag=0;
    if(b==0){
            res%=p;
        }
    else{
        while(b){
    	if (flag==0)ci=a%p;
    	else
          ci=(ci%p)*(ci%p)%p;
        
		if (b&1)res=(res*(ci%p))%p;
        b>>=1;
        flag++;
        //cout<<ci<<"  "<<res<<endl;
    }
    }
    return res;
}
int sum(int p,int k){
	if(k==0)return 1;
	//if(k%2==0)return (p%mod*sum(p,k-1)+1)%mod;
	if(k%2==0)return ((1+qmi(p,(k-1)/2+1))*sum(p,(k-1)/2)%mod+qmi(p,k))%mod;
	return (1+qmi(p,k/2+1))*sum(p,k/2)%mod;
}
int main(){
	
	int A,B;
	cin>>A>>B;
	int res=1;
	for(int i = 2;i <=A;i++){
		int s=0;//i^s 
		while(A%i==0){
			s++;
			A/=i;
		}
		//cout<<"s="<<s<<" "<<endl;
		if(s)res=res*sum(i,s*B)%mod;
	}
	if(!A)res=0;
	cout<<res<<endl;
	
	//cout<<qmi(7,3);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac 安装 MongoDB

一.官网下载安装包 1.1 下载安装包 Download MongoDB Community Server | MongoDB 1.2 将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mongodb&#xff08;可改成自己想要的任何名字&#xff09;。 1.3 按快捷键 Command Shift G 打开前往文件夹弹窗&#…

没有经验能做产品经理吗?

没有经验能做产品经理吗&#xff1f;这是一个经常被讨论的问题&#xff0c;因为很多人想转行成为产品经理&#xff0c;但他们没有相关的工作经验。这里我也给出一些解答。 一、产品经理的职责和技能 首先&#xff0c;让我们看一下产品经理的职责和技能。产品经理是负责产品开…

LeetCode:相交链表(java)

相交链表 题目描述指针法解题 #LeetCode 160题&#xff1a;相交链表&#xff0c;原题链接 原题链接。相交链表–可以打开测试 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返…

【Python Power BI】零基础也能轻松掌握的学习路线与参考资料

Python和Power BI是现代数据分析和可视化领域中最受欢迎的工具之一&#xff0c;Python是一种高级编程语言&#xff0c;广泛用于数据科学和分析&#xff0c;而Power BI是一种业务智能工具&#xff0c;用于创建交互式大屏幕和实时报表。Python和Power BI的结合使用可以为数据科学…

【布隆过滤器】BitMap与布隆过滤器

1.案例&#xff1a;40亿个QQ号&#xff0c;限制1G内存&#xff0c;如何去重&#xff1f; 40亿个unsigned int&#xff0c;如果直接用内存存储的话&#xff0c;需要&#xff1a; 4*4000000000 /1024/1024/1024 14.9G &#xff0c;考虑到其中有一些重复的话&#xff0c;那1G的…

【P31】JMeter 循环控制器(Loop Controller)

这文章目录 一、循环控制器&#xff08;Loop Controller&#xff09;参数说明二、测试计划设计2.1、设置循环次数2.2、勾选永远2.3、设置线程组的持续时间 一、循环控制器&#xff08;Loop Controller&#xff09;参数说明 可以对部分逻辑按常量进行循环迭代 选择线程组右键 …

探索编程的极限:挑战炫技代码

程序员常常被视为具有超强技术能力的人才&#xff0c;而他们手中的代码也往往充满了令普通人惊叹的炫技操作。作为程序员的我&#xff0c;将和大家分享一些炫技的代码写法 一、编程语言介绍 本人主攻Java。下面我将介绍一下Java语言。 Java是一种广泛使用的高级编程语言&…

chatgpt赋能python:PythonShodan:极具威力的网络搜索引擎

Python Shodan&#xff1a;极具威力的网络搜索引擎 Python是一种流行的编程语言&#xff0c;被许多开发人员用来创建各种类型的应用程序和工具。其中一个强大的工具是Shodan&#xff0c;它是一个网络搜索引擎&#xff0c;可以帮助你找到任何与互联网连接的设备或系统。 什么是…

10款提效的在线设计工具推荐

在效率为王的时代&#xff0c;在线设计是设计的未来&#xff0c;为设计师提供了更节省时间、精力和成本的解决方案。 在线设计工具可以通过打开浏览器使用&#xff0c;大多数操作界面比传统设计工具更简单&#xff0c;入门门槛很低。 在这篇文章中&#xff0c;我们精心挑选了…

实验四:MapReduce初级编程实践

1.编程实现文件合并和去重操作 对于两个输入文件&#xff0c;即文件A和文件B,编写MapReduce程序&#xff0c;对两个文件进行合并&#xff0c; 并剔除其中重复的内容&#xff0c;得到一个新的输出文件C。下面是输入文件和输出文件的一个样 例供参考。 输入文件A的样例如下&#…

Tensorflow2基础代码实战系列之CNN文本分类实战

深度学习框架Tensorflow2系列 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark …

Dubbo源码篇08---依赖注入和AOP在Dubbo中的实现

Dubbo源码篇08---依赖注入和AOP在Dubbo中的实现 引言依赖注入使用实践 Wrapper机制使用实践注意 引言 前面三篇文章&#xff0c;我们从使用到原理&#xff0c;详细分析了一遍Dubbo SPI机制的实现原理: Dubbo源码篇05—SPI神秘的面纱—使用篇Dubbo源码篇06—SPI神秘的面纱—原…

STM8、STM8S003F3P6 双串口通信(IO模拟串口)

背景 这里为什么要写串口通信&#xff0c;因为实际项目上使用了串口&#xff0c;STM8S003F3P6的串口简单啊&#xff0c;不值得一提。本文写的串口确实简单&#xff0c;因为这里我想先从简单的写起来&#xff0c;慢慢的把难的引出来。这里呢&#xff0c;做个提纲说明&#xff0c…

VB一款实现图像浏览的ActiveX控件

利用GDI实现浏览图片的ActiveX控件&#xff0c;功能:支持读取PNG格式的图片&#xff0c;支持鼠标飞轮对图片进行缩放&#xff0c;镜像&#xff0c;移动等功能&#xff0c;其中用到了功能强大的GDI&#xff0c;GDI&#xff0c;对初及vb编程爱好者运用GDI-API有很大的研究价值&am…

超级简单的SSM框架(全注解,源码+分析,看一眼就会)

1.什么是SSM&#xff1f; SSM是Spring、SpringMVC、Mybatis的框架整合。 2.什么是Spring? Spring是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架。 优点&#xff1a; 1.通过Spring的IOC特性&#xff0c;将对象之间的…

基于关系抽取的相似度计算

文章目录 一、面向冶金设备运维履历的知识图谱构建与语义相似性度量研究二、KG中的实体相似度计算研究研究假设研究方法第一步&#xff1a;特征生成第二步&#xff1a;模型选择 三、基于司法案例知识图谱的类案推荐个人解惑 一、面向冶金设备运维履历的知识图谱构建与语义相似性…

叮咚买菜业绩大幅低于预期,2023年前景堪忧

来源l&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 叮咚买菜2023年第一季度业绩低于预期 叮咚买菜&#xff08;DDL&#xff09;于5月12日公布了2023年第一季度财报。 财报显示&#xff0c;叮咚买菜的收入同比下降了-8%&#xff0c;从2022年第一季度的54.44亿元人民币下滑…

搭建Stm32遇到的问题汇总

问题一&#xff1a;右侧watch窗口无法显示数据动态变化 现象&#xff1a;在main循环中加入累加的数值都不变化 现象2&#xff1a;单步执行卡在如下函数 原因&#xff1a;一般是因为没有用微库进入半主机模式 解决措施&#xff1a; 措施一&#xff1a;打开勾选下面的。 措施二…

【HTTP】

目录 &#x1f3a8;1. HTTP 请求 &#x1f3f0;1.1 首行 &#x1f451;1.2 URL &#x1f6a9;1.3 Content-Type 和 Content-Length &#x1f34a;1.4 User-Agent &#x1f33d;1.5 Referer ⚽1.6 Cookie &#x1f369;2. HTTP 响应 &#x1f31e;2.1 HTTP 响应 首行…

软件工程学习1:软件项目项目管理

假设你被指派作为一个软件公司的项目负责人&#xff0c;任务是开发一个管理系统&#xff0c;人员规模大约为8人&#xff0c;人员角色应如何确定&#xff1f;应如何进行项目管理&#xff1f;&#xff08;从软件项目管理估算、软件规模、工作量估算、进度计划安排、软件过程模型等…