日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯历届试题----矩阵翻硬币

發(fā)布時(shí)間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯历届试题----矩阵翻硬币 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

矩陣翻硬幣

問(wèn)題描述

小明先把硬幣擺成了一個(gè) n 行 m 列的矩陣。隨后,小明對(duì)每一個(gè)硬幣分別進(jìn)行一次 Q 操作。對(duì)第x行第y列的硬幣進(jìn)行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進(jìn)行翻轉(zhuǎn)。其中i和j為任意使操作可行的正整數(shù),行號(hào)和列號(hào)都是從1開始。當(dāng)小明對(duì)所有硬幣都進(jìn)行了一次 Q 操作后,他發(fā)現(xiàn)了一個(gè)奇跡——所有硬幣均為正面朝上。小明想知道最開始有多少枚硬幣是反面朝上的。于是,他向他的好朋友小M尋求幫助。

聰明的小M告訴小明,只需要對(duì)所有硬幣再進(jìn)行一次Q操作,即可恢復(fù)到最開始的狀態(tài)。然而小明很懶,不愿意照做。于是小明希望你給出他更好的方法。幫他計(jì)算出答案。

輸入格式
  輸入數(shù)據(jù)包含一行,兩個(gè)正整數(shù) n m,含義見(jiàn)題目描述。
輸出格式
  輸出一個(gè)正整數(shù),表示最開始有多少枚硬幣是反面朝上的。
樣例輸入
2 3
樣例輸出
1
數(shù)據(jù)規(guī)模和約定
  對(duì)于10%的數(shù)據(jù),n、m <= 10^3;
  對(duì)于20%的數(shù)據(jù),n、m <= 10^7;
  對(duì)于40%的數(shù)據(jù),n、m <= 10^15;

  對(duì)于10%的數(shù)據(jù),n、m <= 10^1000(10的1000次方)

思路分析:小M的思路確實(shí)能夠解決這個(gè)問(wèn)題,但是我們看看下面的數(shù)據(jù)規(guī)模就可以發(fā)現(xiàn),這種方法是不能解決100%的問(wèn)題的。數(shù)據(jù)量太龐大了,暴力的方式必然出不來(lái)結(jié)果。

如果一個(gè)硬幣反轉(zhuǎn)了n次后正面朝上,且初始狀態(tài)為反面朝上,那么n一定是個(gè)奇數(shù)。根據(jù)題意“?對(duì)第x行第y列的硬幣進(jìn)行 Q 操作的定義:將所有第 i*x 行,第 j*y 列的硬幣進(jìn)行翻轉(zhuǎn)”。我們逆向的理解這個(gè)意思,對(duì)與一個(gè)橫坐標(biāo)為x的硬幣而言,我們反轉(zhuǎn)那些硬幣時(shí)會(huì)需要翻轉(zhuǎn)它呢?答案是橫坐標(biāo)的x的約數(shù)。例如x=9時(shí),翻轉(zhuǎn)橫坐標(biāo)為1,3,9的時(shí)候會(huì)影響它的翻轉(zhuǎn),縱坐標(biāo)同理。

那么這個(gè)題目我們就可以通過(guò)求解擁有奇數(shù)個(gè)約數(shù)的數(shù)來(lái)實(shí)現(xiàn),在數(shù)學(xué)上這種數(shù)字又叫做完全平方數(shù)。即1,4,9,16,25......(2^n)

我們知道矩陣的行號(hào)和列號(hào)是從1開始的,橫坐標(biāo)1-n,縱坐標(biāo)1-m,那么我們需要解決的就是區(qū)間的完全平方數(shù)的個(gè)數(shù)問(wèn)題,最后相乘即可得到(相乘是因?yàn)闄M坐標(biāo)的翻轉(zhuǎn)會(huì)影響縱坐標(biāo),縱坐標(biāo)的翻轉(zhuǎn)也會(huì)影響橫坐標(biāo))。

注意:這里會(huì)涉及到大數(shù)開方的問(wèn)題,不理解的讀者可以參考JAVA應(yīng)試技巧----大數(shù)開方,還要注意在存儲(chǔ)數(shù)據(jù)時(shí)采用的變量類型,以及數(shù)據(jù)之間的轉(zhuǎn)換。

import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String n = in.next();String m = in.next();BigInteger ans = (sqrt(n)).multiply(sqrt(m));System.out.println(ans);}private static BigInteger sqrt(String num) {int length = num.length(); int sqrt_len = 0; // 獲取長(zhǎng)度if(length % 2 == 0) {sqrt_len = length / 2;} else {sqrt_len = length / 2 + 1;}BigInteger beSqrtNum = new BigInteger(num);char[] ch = new char[sqrt_len]; Arrays.fill(ch, '0'); for(int i = 0; i < sqrt_len; i++) { for(char j = '1'; j <= '9'; j++ ) {ch[i] = j;String s = String.valueOf(ch);BigInteger sqrtNum = new BigInteger(s);BigInteger squareNum = sqrtNum.multiply(sqrtNum);if(squareNum.compareTo(beSqrtNum) == 1) {ch[i] -= 1;break;}}}return new BigInteger(String.valueOf(ch));} }

?

?

總結(jié)

以上是生活随笔為你收集整理的蓝桥杯历届试题----矩阵翻硬币的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。