思路:假定乙個硬幣初始時是正面,它被翻轉偶數次仍然是正面,翻轉奇數次就是反面。考慮位於座標(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 操作後,他發現...