歷屆試題 矩陣翻硬幣 大數開方

2021-07-27 07:48:20 字數 2370 閱讀 6035

思路:假定乙個硬幣初始時是正面,它被翻轉偶數次仍然是正面,翻轉奇數次就是反面。考慮位於座標(x, y)的隱蔽,設a是x的約數,b是y的約數,那麼翻轉座標為(a, b)的硬幣時,(x,y)也會翻轉,我們只關心(x,y)翻轉次數的奇偶性。那麼(x,y)的翻轉次數就是x的約數個數 * y的約數個數,題目要求計算反面的數量,那麼就只考慮奇數次翻轉,只有當x的約數個數是奇數並且y的約數個數是奇數時它們的乘積才是奇數。

那麼哪些數的約數個數是奇數個?

4:1,2,4

5:1,5

6:1,2,3,6

9:1,3,9

16:1,2,4,8,16

不難發現只有平方數的約數個數是奇數,那麼對於n*m的矩陣,只要計算出其中座標(x,y)滿足x是平方數,y也是平方數的數量就是答案。行下標是平方數的有sqrt(n)個,列下標是平方數的有sqrt(n)個,那麼ans = sqrt(n) * sqrt(m).

ac**

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define eps 1e-10

#define inf 0x3f3f3f3f

#define pi pairtypedef long long ll;

const int maxn = 1e3 + 5;

struct biginteger }

biginteger operator = (long long num) while(num);

return *this;

}biginteger operator = (const string& str)

biginteger operator + (const biginteger& b) const

return c;

}//大數減小數

biginteger operator - (const biginteger& b) const

c.s.push_back(x);

} c.dealzero();

return c;

}biginteger operator * (const biginteger& b) const

if(g > 0) tmp.s.push_back(g);

c = c + tmp;

} c.dealzero();

return c;

}//單精度除法

biginteger operator / (const int b) const

tmp.s.push_back(div / b);

div %= b;

} for(int i = tmp.s.size() - 1; i >= 0; --i) c.s.push_back(tmp.s[i]);

c.dealzero();

return c;

} bool operator < (const biginteger& b) const

return false; //相等

}bool operator <= (const biginteger& b) const

string tostr()

//大數開方

/**大數開方用法說明:

字串必須從第二個位置開始輸入,且s[0] = '0'

scanf("%s", s+1);

*/ biginteger sqrt(char *s)

//開方準備

//------------------------------------

int l;

int work(string &p, int o,char *o,int i)

}else

return o;

}//-----------------------------------------

};ostream& operator << (ostream &out, const biginteger& x)

istream& operator >> (istream &in, biginteger& x)

int main()

如有不當之處歡迎指出!

歷屆試題 矩陣翻硬幣

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

歷屆試題 矩陣翻硬幣

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

歷屆試題 矩陣翻硬幣

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