鲁康华


私信TA

用户名:1258541307

访问量:1234

签 名:

等  级
排  名 1978
经  验 2527
参赛次数 6
文章发表 5
年  龄 0
在职情况 学生
学  校 鄂州职业大学
专  业

  自我简介:

素质教育漏网之鱼晚睡协会常任理事情侣辩论赛冠军 国家级抬杠运动员一甜相机特约摄影师蜜雪冰城森林玫果宣传大使中国驰名窝里横

解题思路:

首先需要求出最开始有多少枚硬币是反面朝上的。 

那就模拟一下


//第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(奇数),不明白可以看这个图

T矩阵翻硬币{_419.png

//最后我们可以从高位不停地试探,每一个取平方后恰好不超过目标平方数的值

注意事项:

参考代码:

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-07 17:55:36
  • «
  • 1
  • »