Highways UVA

来源:互联网 发布:河北省中标数据网 编辑:程序博客网 时间:2024/06/06 17:11

首先根据对称性可以得出'\'的数量和'/'的数量是相等的,所以只要考虑其中的一种,将得到的结果*2就可以得到最终的结果,将每个都能由线形成的方框都看成一个盒子,同时对于这些点而言,最左边并且最上边的点的位置记为原点,那么每个盒子的长和宽就可以很简单的得到了,然后如果该盒子的长宽存在不是1的最大公约数,说明这个大盒子里存在小盒子,直接舍去。如果满足上述条件,放置盒子的时候要将盒子尽量靠左靠上,这样就形成了对应的盒子左上角的坐标的范围,减去那些可能左上角仍然存在盒子的情况,最后将所有的答案加起来乘2即可,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;int n, m;int record[310][310];int gcd(int a, int b){if (b == 0) return a;return gcd(b,a%b);}void Init(){for (int i = 1; i <= 300; i++)for (int j = 1; j <= 300; j++)record[i][j] = gcd(i, j);}int main(){Init();while (cin >> n >> m){if (n == 0 && m == 0) break;int ans = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (record[i][j] == 1){int amount = (n - i)*(m - j);int amount2 = max(0, n - 2 * i)*max(0, m - 2 * j);ans += (amount - amount2);}}}cout << ans*2 << endl;}return 0;}


原创粉丝点击