问题描述
小明先把硬币摆成了一个 n 行 m 列的矩阵。
随后,小明对每一个硬币分别进行一次 Q 操作。
对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。
输入格式
输入数据包含一行,两个正整数 n m,含义见题目描述。
输出格式
输出一个正整数,表示最开始有多少枚硬币是反面朝上的。
样例输入
2 3
样例输出
1
思路:https://blog.csdn.net/wzt529/article/details/69062721
看了大佬的代码,才有的思路,我们要找的就是被翻了奇数次的硬币!!
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String n = scanner.next();
String m = scanner.next();
BigInteger ans1 = isSqrt(n); // 调用方法
BigInteger ans2 = isSqrt(m);
BigInteger ans = ans1.multiply(ans2); // *出最大值
System.out.println(ans); // 答案
}
private static BigInteger isSqrt(String s1) {
int mlen = s1.length(); // 被开放长度
int len; // 开放后长度
BigInteger beopened = new BigInteger(s1); // 被开方数
BigInteger reserve; // 保存开方后的数
BigInteger square; // 开方数的平方
String character; // 保存arr转化后的字符串
if (mlen % 2 == 0) {
len = mlen / 2; // 判断长度
} else {
len = mlen / 2 + 1;
}
char[] arr = new char[len]; // 数组保存长度
Arrays.fill(arr, '0'); // 将给arr数组的每一个元素赋值0
for (int up = 0; up < len; up++) { // 最高处遍历数组。每一位都转换为开平方数平方后刚好不大于被开方数的程度
for (char i = '1'; i <= '9'; i++) {
arr[up] = i;
character = String.valueOf(arr); // 字符串取数组
reserve = new BigInteger(character); // 开方后的数
square = reserve.multiply(reserve); // 开方数平方=开放后的数*开方后的数
if (square.compareTo(beopened) == 1) { // 开方数平方>被开方数
arr[up] -= 1; // 如果指定的数小于参数返回 -1
break;
}
}
}
return new BigInteger(String.valueOf(arr)); // 返回数组
}
}