矩阵翻硬币(2014年蓝桥杯Java-B组第十题)

历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘 历届试题 矩阵翻硬币   时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。 阅读详情

小明先把硬币摆成了一个 n 行 m 列的矩阵。

    随后,小明对每一个硬币分别进行一次 Q 操作。
 
    对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。
 
    其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
 
    当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
 
    小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。
    聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。
 
【数据格式】
    输入数据包含一行,两个正整数 n m,含义见题目描述。
    输出一个正整数,表示最开始有多少枚硬币是反面朝上的。
 
【样例输入】
2 3
 
【样例输出】
1
 
【数据规模】
对于10%的数据,n、m <= 10^3;
对于20%的数据,n、m <= 10^7;
对于40%的数据,n、m <= 10^15;
对于10%的数据,n、m <= 10^1000(10的1000次方)



1 1 ->1
1 2 ->1
1 3 ->1
1 4 ->2
1 5 ->2
1 6 ->2
1 7 ->2
1 8 ->2
1 9 ->3
1 10 ->3
1 11 ->3
1 12 ->3
1 13 ->3
1 14 ->3
1 15 ->3
1 16 ->4
1 17 ->4
1 18 ->4
1 19 ->4
...
...


规律就是,当x固定为1时,按照3个1,5个2,7个3,9个4一直走下去.
     y            f(x): 
 [1 -- 3]  ....      1
 [4 -- 8]  ....      2
 [9 -- 15] ....     3
[16 -- 24] ....    4
[25 -- 35] ....    5
[36 -- 48] ....    6


...
...
好巧啊,(a) -- (b)...i
b = (i+1)*(i+1)-1
a=i*i

导出公式 


f(y) = ( √(y+1) ) - 1  算式写出后用进一法取整.




算是完成一半




当y固定为1时


     x          f(x): 
 [1 -- 3]  ....  1
 [4 -- 8]  ....  2
 [9 -- 15] ....  3
[16 -- 24] ....  4
[25 -- 35] ....  5
[36 -- 48] ....  6
...
...


好巧啊,与x固定时一样.


然后经过测试,f(x)*f(y)为答案.....


输入:
 4   4 --> 4    (2*2)
16  25 --> 20   (4*5)
  100 100 --> 100  (10*10)


import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Scanner;

public class test {
	
	
	public static void main(String[] args) {
		//想看那个方法就直接调用哪个
		//FangFaOne();
		//FangFaTwo();
	}
	
	
	//方法一:拼命算,最笨的方法,但是当数据过大时会,没法储存
	public static void  FangFaOne(){
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int x = in.nextInt();
			int y = in.nextInt();
			//用boolean二维数组储存矩阵,从[1][1]开始
			boolean[][] grap = new boolean[x+1][y+1];
			for(int i=1;i <= x;i++){
				for(int j=1;j<=y;j++){
					//全部的置为正面
					grap[i][j]=true;
				}
			}
			int num=1;
			//有几枚硬币就循环几次
			while(num<=x*y){
				//取x_num,表示在第几行,y_num表示第几列
				int x_num = num/y+1;
				int y_num = num%y;
				//在行末的时候需要格外处理,例如num=3,表示第三枚硬币在1行3列
				if(num%y == 0)
				{
					x_num =num/y;
					y_num = y;
				}
				
				//Q操作
				for(int i = 1;i * x_num <= x;i++){
					for(int j= 1;j *y_num <= y;j++){
						grap[i * x_num][j *y_num]=!grap[i * x_num][j *y_num];
					}
				}
				//处理下一枚硬币
				num+=1;
			}

			//统计false(反面)的数量
			int sum = 0;
			for(int i=1;i <= x;i++){
				for(int j=1;j<=y;j++){
					if(!grap[i][j]){
						sum+=1;
					}
				}
			}
			System.out.println(sum);
		}
	}
	
	
	
	//方法二:将1的规律总结,用大数处理
	public static void  FangFaTwo() {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			//因为开方涉及小数,所以采用BigDecimal,BIG小数
			BigDecimal x = in.nextBigDecimal();
			BigDecimal y = in.nextBigDecimal();
			BigDecimal dealX = deal(x);
			BigDecimal dealY = deal(y);
			//大数乘操作
			System.out.println(dealX.multiply(dealY));
		}
	}
	
	public static BigDecimal deal(BigDecimal x){
		//+1操作
		x = x.add(BigDecimal.valueOf(1));
		//开方操作,太大需要重新定义大数的格式
		MathContext mc = new MathContext(1000,RoundingMode.HALF_DOWN);
		x = new BigDecimal(Math.sqrt(x.doubleValue()),mc);
		//-1操作
		x = x.add(BigDecimal.valueOf(-1));
		//进一法取整,0表示小数有零位,
		//BigDecimal.ROUND_UP表示取整类型,是进一法(向上进)
		//BigDecimal.ROUND_DOWN表示取整类型,是去一法(向下进)
		x = x.setScale(0, BigDecimal.ROUND_UP);
		return x;
	}
}


貌似是官方代码

import java.math.BigInteger;
import java.util.Scanner;
public class test2 {
	
	private static BigInteger sqrt(BigInteger n) {
		BigInteger two = BigInteger.valueOf(2);
		BigInteger prv = n.divide(two);
		BigInteger now = prv.add(n.divide(prv)).divide(two);
		while (prv.compareTo(now) > 0) {
			prv = now;
			now = prv.add(n.divide(prv)).divide(two);
		}
	return now;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		BigInteger n = sqrt(sc.nextBigInteger());
		BigInteger m = sqrt(sc.nextBigInteger());
		System.out.println(n.multiply(m));
	}
}


Java蓝桥杯历届试题 矩阵翻硬币 问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。   当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。 阅读详情

相关推荐

蓝桥杯:矩阵翻硬币 java实现

10.矩阵翻硬币 小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y列的硬币进行翻转。 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。 小明想知道最开始有多少枚硬币是反面朝上的。...

炭烧生蚝的博客 512

矩阵翻硬币

一、题目 小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

晓风残月龙 1128

2014年 第5届 蓝桥杯 Java B组 省赛解析及总结

01 武功秘籍 书的构造方式,思维题 02 切面条 发现规律,思维题 03 猜字母 数组中元素的挪动和挤压 04 大衍数列 考察奇偶数判断 05 圆周率 细心,极限思维 06 奇怪的分式 枚举abcd,分数运算,最大公约数 07 扑克排序 带重复元素的全排列 08 分糖果 模拟 **09 地宫取宝 搜索->记忆型递归,因为子问题重复求解 ****10 矩阵翻硬币 数学;字符,字符串,BigInteger的互相转化

upward 3504

【蓝桥杯】历届试题 矩阵翻硬币

历届试题 矩阵翻硬币—————————————————-痞子小小崔 时间限制:1.0s 内存限制:256.0MB问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始

Pzxxc 689

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

eNSP-交换机VLAN配置

VLAN

乌托托的博客 8803

蓝桥--矩阵翻硬币--二分枚举

枚举n以内平方小于n的个数,非平方的因子数是成对出现的,只出现在前半部分,所以mid =(l+r)//2+1(+1是向上取整,防止错过平方数),最终的l代表有几组因子(翻动了几次),由于最终态为全部正面朝上,所以初态正面朝下的个数就是?聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。对于10%的数据,n、m

weixin_43008312的博客 668

TL494充电器原理与维修 (转)

TL494充电器原理与维修 电动自行车充电器多采用开关 电源,型号虽多,但电路结构大同小异,主要区别在于所选的脉宽调制(PWM)芯片不同如(UC3845、UC3842、SG3524、TL494)。现以佳腾牌 充电器为例,介绍其原理和故障检修方法。 一、电路原理 根据实物测绘的佳腾牌充电器电路原理如图1所示。整机可分为PWM产生和推动电路、功 率开关变换电路、...

weixin_30500663的博客 1814

矩阵翻硬币 蓝桥杯

题目:

SnailSet 1万+

从零配置Archery:手把手教你用Docker部署多数据库审核系统(MySQL/PostgreSQL/ClickHouse)

本文详细介绍了如何从零开始使用Docker部署Archery多数据库审核系统,涵盖MySQL、PostgreSQL和ClickHouse的配置与整合。文章提供了生产级Docker-compose配置、审核规则定制、工单流程设置以及企业微信通知集成等实战指南,帮助团队构建统一的企业级SQL审计平台,提升数据库操作规范与安全。

e4f5g6h7的博客 940

用Spirent Test Center测试交换机Head of Line(HOL)Blocking

测试目的:设备执行拥塞控制,使非阻塞端口不受阻塞端口影响 预设条件:在RFC2889里按以下步骤设置,端口1和端口3同时向端口4发送数据包,端口1向端口2发送数据包 测试步骤:运行设置好的RFC2889 测试结果:所有frame size都显示没有Head of Line(HOL),即非阻塞端口不受阻塞端口所影响 ...

Yuna_的博客 1356

蓝桥杯:矩阵翻硬币(大数开根号)

问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。   当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

yf224的博客 933

从CTF到实战:Frida Hook无导出SO函数的3种特殊姿势

本文深入探讨了在移动安全逆向工程中,如何利用Frida Hook无导出SO函数的三种高级技巧:字符串引用定位法、调用栈回溯法和内存特征码扫描。针对安卓So层加固和混淆场景,文章结合CTF赛题与实战案例,详细解析了每种方法的原理、实现步骤与适用场景,为安全研究人员提供了从理论到实践的完整解决方案。

jenkins8butler的博客 515

矩阵翻硬币蓝桥杯

题目:      小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。   当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面

afBird 445

MATLAB与ROS联合仿真——控制类功能模块介绍

MATLAB与ROS联合仿真——控制类功能模块介绍

慕羽★的博客 2352

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 546

2014第五届蓝桥杯JavaB组省赛真题详解

2014第五届蓝桥杯JavaB组省赛真题详解 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 第一题:武功秘籍 题目描述: 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页...

hyx153183740的博客 4264

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

蓝桥杯省赛真题2014年第五届Java本科B组第10题——矩阵翻硬币

蓝桥杯省赛真题2014年第五届Java本科B组第10题——矩阵翻硬币

影龙武的博客qq_43594119 782

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝桥杯--历届真题 翻硬币【第四届】【省赛】【B组】

试题 历届真题 翻硬币【第四届】【省赛】【B组】 提交此题评测记录 资源限制 时间限制:1.0s 内存限制:256.0MB   小明正在玩一个“翻硬币”的游戏。   桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。   比如,可能情形是:**oo***oooo   如果同时翻转左边的两个硬币,则变为:oooo***oooo   现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动...

with_wine的博客 4186

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java蓝桥杯练习 矩阵翻硬币

java蓝桥杯练习 矩阵翻硬币 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。 当小明对所有硬币都进行了一次 Q 操作后,他...

kobe_cb的博客 340

Java实现 蓝桥杯 历届试题 矩阵翻硬币

问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。 小明想知道最开始有多少枚硬币是反面朝上的。于是,他...

南 墙 1万+

蓝桥杯第五届真题:矩阵翻硬币

点击查看:蓝桥杯历年真题 题解目录 矩阵翻硬币 package java_2014_B; import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner; //第x行第y列被翻动的总次数? //考虑第1行,第y列,y有多少真因子,就会被翻动多少次,而所有的y中,只有平方数的真因子个数为奇数(...

Xiong-er 的博客 496

2014年蓝桥杯省赛JavaB题解

真题下载地址 需要2014年蓝桥杯JavaB组真题的可以在评论下留一下邮箱 目录 一、标题:武功秘籍 二、标题:切面条 三、标题:猜字母 四、标题:大衍数列 五、标题:圆周率 六、标题:奇怪的分式 七、标题:扑克序列 八、标题:分糖果 九、标题:地宫取宝 十、标题:矩阵翻硬币(难题) 一、标题:武功秘籍 找规律 answer:7 二、标题:切面条 找规律 ...

the blog of Lee 717

历届试题 矩阵翻硬币

问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。   当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。   小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。   聪明的小M告诉小明,只需要对所有硬币再进行一

Lionel 3169

5-10 矩阵翻硬币Java

/*标题:矩阵翻硬币 小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上...

qq_41629684的博客 306

蓝桥杯-矩阵翻硬币

问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。   其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。   当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

enjoy_jych的博客 1130
上一篇: 标签中id和name的区别
下一篇: JavaBean总结
codeforces
博客等级 码龄12年 45粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值