藍橋杯 PREV 34 矩陣翻硬幣(大數)

2021-10-03 02:55:29 字數 1361 閱讀 2386

prev-34 矩陣翻硬幣

思路:1.由題意可知,將所有硬幣都進行一次q操作後,被翻轉奇數次的硬幣是反面朝上的;

2.定義f(x

)f(x)

f(x)

為正整數x

xx的約數個數,那麼座標為(a,

b)

(a,b)

(a,b

)的硬幣會被翻轉f(a

)∗f(

b)

f(a)*f(b)

f(a)∗f

(b)次,我們知道只有奇數乘以奇數結果才會是奇數,因此當且僅當f(a

)f(a)

f(a)

與f (b

)f(b)

f(b)

都為奇數時(a,

b)

(a,b)

(a,b

)才會是反面朝上;

3.如果乙個數x

xx的約數個數為奇數個,除去1

11和自身,那麼必定還剩下奇數個約數;我們設a

aa為x

xx的乙個約數,那麼x/a

x/ax/

a必定也是x

xx的乙個約數,因此想要擁有奇數個約數那麼必定存在a

aa,使得a=x

/a

a=x/a

a=x/

a,換言之x

xx是乙個完全平方數;

4.我們不難發現n

nn以內的完全平方數個數即為[n]

[\sqrt]

[n​]

(其中[]

為向下取整符號);

5.通過簡單排列組合的知識我們可以得到最後的答案即為[n]

∗[m]

[\sqrt]*[\sqrt]

[n​]∗[

m​];

6.剩下的我們只需要模擬大數乘法、大數開方即可;

**:

#include

using

namespace std;

string mul

(string & a, string & b)

for(

int i =

0; i < s.

length()

; i++)if

(s[i]

!='0'

)return s.

substr

(i);

return

"0";

}inline

bool

cmp(string & a, string b)

string sqrt

(string & s)

return r;

}int

main()

藍橋杯 PREV 34 矩陣翻硬幣

題目 矩陣翻硬幣 鏈結 問題描述 小明先把硬幣擺成了乙個 n 行 m 列的矩陣。隨後,小明對每乙個硬幣分別進行一次 q 操作。對第x行第y列的硬幣進行 q 操作的定義 將所有第 i x 行,第 j y 列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。當小明對所有硬幣都進...

PREV 34 矩陣翻硬幣

歷屆試題 矩陣翻硬幣 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明先把硬幣擺成了乙個 n 行 m 列的矩陣。隨後,小明對每乙個硬幣分別進行一次 q 操作。對第x行第y列的硬幣進行 q 操作的定義 將所有第 i x 行,第 j y 列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數...

藍橋杯 矩陣翻硬幣

問題描述 小明先把硬幣擺成了乙個 n 行 m 列的矩陣。隨後,小明對每乙個硬幣分別進行一次 q 操作。對第x行第y列的硬幣進行 q 操作的定義 將所有第 i x 行,第 j y 列的硬幣進行翻轉。其中i和j為任意使操作可行的正整數,行號和列號都是從1開始。當小明對所有硬幣都進行了一次 q 操作後,他...