鲁康华


私信TA

用户名:1258541307

访问量:1083

签 名:

等  级
排  名 1832
经  验 2513
参赛次数 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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

这个图片看不懂啊
2022-04-07 17:55:36
  • «
  • 1
  • »