Java输出小明算对多少题目_2014年Java方向C组第十题

标题:矩阵翻硬币

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

随后,小明对每一个硬币分别进行一次 Q 操作。

对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。

其中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;

对于100%的数据,n、m <= 10^1000(10的1000次方)。

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

解析:

方案一:

题目中提示:“聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。”

即假设所有格子硬币都是正面的,反向进行上述分析的模拟。

Scanner input = new Scanner(System.in);

int n = input.nextInt(); //硬币矩阵n行

int m = input.nextInt(); //硬币矩阵m列

int[][] arr = new int[n+1][m+1]; //定义硬币(数组大小+1的原因和题意相符,下标从1开始)

//将所有硬币变成正面(1:正面;0:反面)

for (int x = 1; x <= n; x++) {

for (int y = 1; y <= m; y++) {

arr[x][y] = 1;

}

}

//模拟Q操作

for (int x = 1; x <= n; x++) {

for (int y = 1; y <= m; y++) {

//循环行号和列好的倍数

for (int i = 1; i*x <= n; i++) {

for (int j = 1; j*y<=m; j++) {

int temp = arr[i*x][j*y];

arr[i*x][j*y] = temp==1?0:1;

}

}

}

}

int count = 0; //假设反面的数量为0

for (int x = 1; x <= n; x++) {

for (int y = 1; y <= m; y++) {

if(arr[x][y] == 0)

count++;

}

}

System.out.println(count);

由于题目有专门的描述如下:

【数据规模】

对于10%的数据,n、m <= 10^3;

对于20%的数据,n、m <= 10^7;

对于40%的数据,n、m <= 10^15;

对于100%的数据,n、m <= 10^1000(10的1000次方)。

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2000ms

则表示此题对执行效率有一定的要求,而进行方案一进行模拟的形式,如果数据量大的情况下,效率低,不能完全满足题目的要求。

方案二:

假设硬币举证如下,模拟所有硬币Q操作翻转过程如下:

1 2 3

4 5 6

7 8 9

对第一个硬币Q操作,需要翻转硬币:1,2,3,4,5,6,7,8,9(即全部)

对第二个硬币Q操作,需要翻转硬币:2,5,8

对第三个硬币Q操作,需要翻转硬币:3,6,9

对第四个硬币Q操作,需要翻转硬币:4,5,6

对第五个硬币Q操作,需要翻转硬币:5

对第六个硬币Q操作,需要翻转硬币:6

对第七个硬币Q操作,需要翻转硬币:7,8,9

对第八个硬币Q操作,需要翻转硬币:8

对第九个硬币Q操作,需要翻转硬币:9

思路:

(1)每个硬币,如果知道被翻转了几次,则可以求出该硬币初始状态是正面还是反面,翻转了奇数次硬币初始为反面,翻转了偶数次硬币为正面。

(2)通过上述数据得出规律,翻转次数=行号的约数个数*列号的约数个数,即:

第一个硬币,行号为1(约数1,只有1个),列号为1(约数1,只有1个),翻转数量=1*1=1

第二个硬币,行号为1(约数1,只有1个),列号为2(约数1,2,有2个),翻转数量=1*2=2

第三个硬币,行号为1(约数1,只有1个),列号为3(约数1,3,有2个),翻转数量=1*2=2

第四个硬币,行号为2(约数1,2,有2个),列号为1(约数1,有1个),翻转数量=2*1=2

第五个硬币,行号为2(约数1,2,有2个),列号为2(约数1,2,有2个),翻转数量=2*2=4

第六个硬币,行号为2(约数1,2,有2个),列号为3(约数1,3,有2个),翻转数量=2*2=4

第七个硬币,行号为3(约数1,3,有2个),列号为1(约数1,有1个),翻转数量=2*1=2

第八个硬币,行号为3(约数1,3,有2个),列号为2(约数1,2,有2个),翻转数量=2*2=4

第九个硬币,行号为3(约数1,3,有2个),列号为3(约数1,3,有2个),翻转数量=2*2=4

(3)实际上不需要求行号和列号的约数个数,只需要确定约数个数是奇数还是偶数即可,如何确定某个数字的约数个数是奇数还是偶数,有规律:平方数的约数个数是奇数,其它数字的约数个数为偶数,例如:

4约数(1,2,4)有三个为奇数;9的约数(1,3,9)有三个为奇数;16约数(1,2,4,8,16)有5个为奇数

5约束(1,5)有两个为偶数;10约束(1,2,5,10)有四个为偶数;15约数(1,3,5,15)有四个为偶数

(4)翻转次数=行号的约数个数*列号的约数个数;并且(奇乘奇=奇,奇乘偶=偶,偶乘偶=偶),当结果为奇数时,初始状态才是反面,则要求行号约数个数和列号的约数个数都为奇数,则要求行号和列号都为平方数。

(5)即题目含义变成了求行号范围内有几个平方数,列号范围内有几个平方数,结果为两个数字的乘积。

(6)如果循环遍历行号和列号求含有平方数的个数,效率仍然很低下,有规律:某个数字内平方数的个数等于该数字的开方取整,例如:

9里面(1,4,9)三个平方数,9的开方也等于三;

20里面(1,4,9,16)四个平方数,20的开方然后取整等于四。

(7)我们得到结论:初始为反面的个数=行号的开方+列号的开方。

(8)由于行号和列号范围可以为(10的1000次方),直接用数字类型无法表示,无法使用Math.sqrt进行开方,只能将数字做为字符串进行处理。

(9)当数字字符串的长度为偶数,则开方结果的长度为(本身长度/2);当数字字符串的长度为奇数,则开方结果的长度为(本身长度/2+1),例如:

99长度为2,开方取整为9,长度为1;100长度为3,开方结果为10,长度为2;

(10)确定了开方长度之后,利用BigInteger和char[]数组,确定数组每一位数字求出开方结果。

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

String n = input.next(); //硬币矩阵n行

String m = input.next(); //硬币矩阵m列

BigInteger rowSqrt = sqrt(n);

BigInteger colSqrt = sqrt(m);

System.out.println(rowSqrt.multiply(colSqrt));

}

public static BigInteger sqrt(String s)

{

//数字字符串的长度为偶数,则开方结果的长度为(本身长度/2);

//当数字字符串的长度为奇数,则开方结果的长度为(本身长度/2+1)

int len = s.length() % 2 == 0 ? s.length()/2 : s.length()/2+1; //求开方之后的字符串长度

char[] arr = new char[len]; //定义字符数组用于存放开方后的字符串

Arrays.fill(arr,'0'); //将字符数组所有元素设置为'0'

BigInteger num = new BigInteger(s); //将字符串转成BigInteger类型

for (int i = 0; i < arr.length; i++)

{

//循环确定字符数组每一位的数字

for (char c = '0'; c <= '9'; c++)

{

arr[i] = c;

BigInteger sqrtNum = new BigInteger(String.valueOf(arr));

if(sqrtNum.pow(2).compareTo(num) == 1) //当前假设数字的平方超过了数字本身,则减1操作

{

arr[i] -= 1;

break;

}

}

}

return new BigInteger(String.valueOf(arr));

}

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

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

相关文章

iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

IIf返回由逻辑测试确定的两个数值或字符串值之一。语法数字IIf(Logical EXPression, Numeric Expression1, Numeric Expression2)如果 Logical Expression 取值为 TRUE&#xff0c;则此函数返回 Numeric Expression1&#xff0c;否则&#xff0c;返回 Numeric Expression2。字符…

java 取pdf 文本域_java – 使用iText从pdf文件中提取文本列

我需要使用iText从pdf文件中提取文本.问题是&#xff1a;一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中列被合并为结果(即同一行中两列的文本)这是代码&#xff1a;public class pdf{private static String INPUTFILE "http://www.revuemedecinetropicale.…

java 反射执行语句_JAVA反射机制

JAVA反射机制定义&#xff1a;JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称…

java 非静态 初始化_Java非静态代码块和实例初始化过程

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候&#xff0c;都会执行一次&#xff0c;且先于构造器执行③若有多个非静态的代码块&#xff0c;那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。所以你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题&#xff0c;特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有…

linux es连接mysql_Linux下ES,kibana,mysql,kafka,zookeeper启动关闭方式

Linux下ES&#xff0c;kibana,mysql,kafka&#xff0c;zookeeper启动关闭方式ES前台方式启动切换到ES的bin目录下&#xff0c;执行./elasticsearch命令关闭窗口或者ctrlc会停止运行后台方式启动同样切换到ES的bin目录下&#xff0c;执行 ./elasticsearch -d 命令查看实时的日志…

java.util.timertask_java.util.TimerTask翻译

java.utilClass TimerTaskjava.lang.Objectjava.util.TimerTask All Implemented Interfaces:public abstract class TimerTaskextendsObjectimplementsRunnableA task that can be scheduled for one-time or repeated execution by a Timer. 由Timer安排执行一次或重复执行的…

java还值_Java到底是引用传递还是值传递

前言前段时间在群里看到类似这样一个问题&#xff0c;下面的代码会输出什么呢&#xff1f;public void test(){String str "hello";change(str);System.out.println(str);}private void change(String str){str "world";}当时看到这题&#xff0c;瞬间勾…

什么是java中的面向对象编程_什么是面向对象编程

什么是面向对象编程时间&#xff1a;2018-01-23 来源&#xff1a;面向对象编程讲解一.前言其实不管是java还是.net都是属于面向对象程序设计语言&#xff0c;归根结底&#xff0c;它们都离不开面向对象&#xff0c;所以什么是面向对象呢&#xff0c;意思就是object-oriente…

java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...

思路一先找到最长的数组&#xff0c;然后循环短的数组并判断元素是否在长数组中public class Main {public static void main(String[] args) throws CloneNotSupportedException {String[] strArr1{"ee","aa","bb","cc"};String[] st…

java如何给顺序表赋值_JAVA模拟新增顺序表及单链表

最近在回顾大学学的数据结构&#xff0c;这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增1顺序表新增/*** 顺序www.cppcns.com表** author cjd**/public class ArrayList {private Object[] elementData; // 底层是一个数组&#xff0c;目前还没有确定长度private int…

php sql查询两个表语句,sql多表查询语句与方法

sql多表查询有很多种方法&#xff0c;如有自然连接 INNER JOIN,外边查询LEFT JOIN,交叉查询JOIN,交叉连接JOIN等join on left on 等多的是哦。sql多表查询语句与方法sql多表查询有很多种方法&#xff0c;如有自然连接 INNER JOIN,外边查询LEFT JOIN,交叉查询JOIN,交叉连接JOIN等…

php浏览服务器某一文件夹内容,php删除web服务器中指定目录下的指定格式的文件...

今天还在写VipSystem Pro的授权部分&#xff0c;用户授权后&#xff0c;生成匹配该用户的唯一的php文件集合(在一个目录下)&#xff0c;然后进行zip下所并弹出下载。这个临时生成的zip文件存放在我指定的一个目录。每个用户授权不同的功能&#xff0c;都会产生一个唯一的zip压缩…

PHP的html实现xpath解析,php用xpath解析html的代码实例讲解

实例1$xml simplexml_load_file(https://forums.eveonline.com);$names $xml->xpath("html/body/p/p/form/p/p/p/p/p[*]/p/p/table//tr/td[classtopicViews]");foreach($names as $name){echo $name . "";}实例2$url http://www.baidu.com;$ch curl…

php phpexcel用法,PHPExcel用法总结

PHPExcel用法总结总结一下PHPExcel的用法~//设置PHPExcel类库的include path//这里貌似直接include类文件就可以了# set_include_path(.. PATH_SEPARATOR .# ExcelPHP_LIBS . PATH_SEPARATOR .# get_include_path());/*** 以下是使用示例&am…

nginx php value,PHP+NGINX参数优化

Failed requests: 0Write errors: 0Requests per second: 3712.72 [#/sec] (mean)Time per request: 134.672 [ms] (mean)Time per request: 0.269 [ms] (mean, across all concurrent requests)Transfer rate: 732.37 [Kbytes/sec] received1000并发&#xff1a;Concurrency L…

php追加数据,php追加数据到mysql

追加数据 php mysqlphp追加数据到mysql在mysql里的一个表user中有个name的字段表中已经有一条记录id字段值是1name字段的值是”周”我现在想追加”杰伦”两个字到这个字段中也就是让这条记录的name字段的值从原来的”周”变成现在的”周杰伦”请问要怎么操作呢&#xff1f;如何…

php escapeshellcmd,利用/绕过 PHP escapeshellarg/escapeshellcmd函数

escapeshellarg和escapeshellcmd的功能escapeshellarg1.确保用户只传递一个参数给命令2.用户不能指定更多的参数一个3.用户不能执行不同的命令escapeshellcmd1.确保用户只执行一个命令2.用户可以指定不限数量的参数3.用户不能执行不同的命令让我们用groups去打印组里每个userna…

php 绕waf,【技术分享】php webshell分析和绕过waf技巧

作者&#xff1a;阻圣预估稿费&#xff1a;400RMB(不服你也来投稿啊&#xff01;)投稿方式&#xff1a;发送邮件至linwei#360.cn&#xff0c;或登陆网页版在线投稿前言WebShell是攻击者使用的恶意脚本&#xff0c;它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webs…

php写好程序后需要嵌套,什么是PHP嵌套函数?

这不仅是副作用&#xff0c;而且实际上是动态修改程序逻辑的非常有用的功能。它来自过程式PHP时代&#xff0c;但如果您想以最直接的方式为某些独立功能提供替代实现&#xff0c;那么它也可以与OO体系结构一起使用。(虽然在大多数情况下&#xff0c;OO是更好的选择&#xff0c;…