解题思路:
首先需要求出最开始有多少枚硬币是反面朝上的。
那就模拟一下
//第x行第y列被翻动的总次数?
//考虑第1行,第y列, y有多少真因子,就会被翻动多少次,而所有的y中,只有平方数的真因子个数为奇数(约数总是成对出现的)
//考虑第1列,第x行, x有多少真因子,就会被翻动多少次,而所有的x中,只有平方数的真因子个数为奇数
//x, y硬币被翻动的次数=x真因子个数*y真因子个数,只有奇数*奇数=奇数,所以,若要x,y为反面,必须x, y都是平方数
//因此,反面硬币总数= =m中的平方数的个数*n中平方数的个数
//那么在m中有多少个平方数呢?答案是sqrt(m)向下取整个,如9内有三个平方数1, 4, 9; 16里面有4个平方数1, 4, 9, 16; 25内有5个平方数
//因此这个题等价于求sqrt(m)*sqrt(n),那么怎么对一一个很大的数开平方呢?
//假设一个数的长度为length,其平方根的长度为length/2 (偶数) 或者length/2+1(奇数),不明白可以看这个图
//最后我们可以从高位不停地试探,每一个取平方后恰好不超过目标平方数的值
注意事项:
参考代码:
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class T1450矩阵翻硬币 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
System.out.println(sqrt(s1).multiply(sqrt(s2)));
}
private static BigInteger sqrt(String s) {
int leng = s.length();
int len = 0;
if (leng%2==0) {
len=leng/2;
}else {
len=leng/2+1;
}
char sArr[]=new char[len];
Arrays.fill(sArr, '0');
BigInteger target = new BigInteger(s);
for (int pos = 0; pos < len; pos++) {
for (char c = '1'; c <= '9'; c++) {
sArr[pos]=c;
BigInteger pow =new BigInteger(String.valueOf(sArr)).pow(2);
if (pow.compareTo(target)==1) {
sArr[pos]-=1;
break;
}
}
}
return new BigInteger(String.valueOf(sArr));
}
}
0.0分
3 人评分
鲁康华 2022-04-30 00:01:32 |
建议先去了解一下CAB高中知识排列问题