国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Kickstart2017 Round A - A.Square Counting(Math)

2019-11-06 06:19:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

¥## 題目鏈接 https://code.google.com/codejam/contest/8284486/dashboard

題意

給一個(gè)m?n的格點(diǎn)圖,求這個(gè)格點(diǎn)圖中正方形的數(shù)目。

思路

包括正正方形和斜正方形。

正正方形數(shù)目

我們用f(i)表示邊長(zhǎng)為i的正方形數(shù)目。

明顯可知f(1)=mn,我們推一下f(2),f(3)...

設(shè)如下格點(diǎn)圖的長(zhǎng)為m,寬為n(設(shè)m≥n): 這里寫圖片描述 首先我們選定左上角的邊長(zhǎng)為2的正方形。

我們水平向右平移,每次平移一個(gè)單位,可以平移m?2次,會(huì)產(chǎn)生m?1個(gè)2?2的正方形。我們將其向下平移,每次平移一個(gè)單位,可以平移n?2次,會(huì)產(chǎn)生n?1個(gè)2?2的正方形。

于是我們可知f(2)=(m?1)(n?1)

同理可以推得f(3)=(m?2)(n?2), f(4)=(m?3)(n?3), f(n)=(m?(n?1))(n?(n?1))

所以我們正正方形的數(shù)目:

ans1=f(1)+f(2)+...+f(n)

? =∑i=1n(m?(i?1))(n?(i?1))

? =∑i=0n?1(m?i)(n?i)

? = n(n+1)(3m?n+1)6

斜正方形數(shù)目

首先,假設(shè)我們已經(jīng)有一個(gè)i?i的正正方形了,那么正正方形中的最大斜正方形(表示其不能再增大)有多少個(gè)呢?我們?cè)O(shè)g(i)為邊長(zhǎng)為i的正正方形數(shù)目包含的最大斜正方形數(shù)目。

假設(shè)i=2g(i)=1 這里寫圖片描述

假設(shè)i=3g(i)=2 這里寫圖片描述

其實(shí)觀察可知:在邊長(zhǎng)為i?i的正正方形里面,最大斜正方形的數(shù)目g(i)=i?1(選定一條邊,除去最兩邊的2個(gè)點(diǎn),其他點(diǎn)都有最大斜正方形)。

那么,我們每個(gè)邊長(zhǎng)為i?i的正正方形里面都有g(i)個(gè)斜正方形,我們邊長(zhǎng)為i的正正方形有f(i)個(gè),那么所有的斜正方形數(shù)目為:

ans2=f(1)g(1)+f(2)g(2)+...+f(n)g(n)

? =∑i=1nf(i)g(i)

? =∑i=0n?1f(i)g(i)

? =∑i=0n?1(m?i)(n?i)(i?1)

? =n(2m?n)(n+1)(n?1)12

所以我們最后的結(jié)果為:n(n+1)(3m?n+1)6+n(2m?n)(n+1)(n?1)12

代碼

#include <bits/stdc++.h>using namespace std;inline int in() {int x; scanf("%d", &x); return x;}#define PR(x) {cout << #x << ' ' << x << endl;}#define LL long longconst LL mod = 1e9 + 7;LL power(LL a, LL n) { LL res = 1; while (n) { if (n & 1) res *= a, res %= mod; a *= a; a %= mod; n >>= 1; } return res % mod;}LL DIV(LL a, LL b) { LL t = power(b, mod - 2); return a * t % mod;}LL mul(LL a, LL b) { return a * b % mod;}inline LL add(LL a, LL b) { return a + b < mod ? a + b : a + b - mod;}int main() { int T = in(), kase = 1; while (T--) { LL m, n; cin >> m >> n; m--, n--; if (m < n) swap(m, n); LL v1 = mul(n, n + 1); LL v2 = (3 * m - n + 1) % mod; LL res1 = mul(v1, v2); res1 = DIV(res1, 6); LL v3 = (2 * m - n) % mod; v3 = mul(n, v3); LL v4 = mul(n + 1, n - 1); LL res2 = mul(v3, v4); res2 = DIV(res2, 12); LL ans = add(res1, res2); cout << "Case #" << kase++ << ": " << ans << endl; } return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永和县| 正蓝旗| 噶尔县| 浦县| 会宁县| 时尚| 巴塘县| 上虞市| 得荣县| 东台市| 五华县| 虞城县| 固阳县| 长海县| 宝兴县| 罗甸县| 临颍县| 张掖市| 密山市| 武夷山市| 阜康市| 姜堰市| 涿州市| 崇左市| 建德市| 长岭县| 清镇市| 饶阳县| 资源县| 石棉县| 吴江市| 九台市| 宜章县| 潍坊市| 岐山县| 象州县| 木兰县| 阳原县| 三门县| 亚东县| 谢通门县|