人在(0,0)点,问n*m的矩阵上的点有多少可以与人直接可见,其实就是矩阵上点与(0,0)点的形成的斜率种类数。
#pragma comment(linker,"/STACK:102400000,102400000") #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<string> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<cstring> #include<set> using namespace std; typedef long long LL; LL cnt, ans, m; LL q[20]; void gao(LL x, LL pre, LL flag, LL key) { if (x == cnt) { if (flag == 0) ans -= key / pre; else ans += key / pre; return; } gao(x + 1, pre, flag, key); gao(x + 1, pre*q[x], flag ^ 1, key); } LL ask(LL n) { cnt = 0; LL t = n; ans = 0; for (LL i = 2; i*i <= t; i++) { if (t%i) continue; while (t%i == 0) t /= i; q[cnt++] = i; } if (t > 1) q[cnt++] = t; gao(0, 1, 1, m); return ans; } int main() { LL T, n; cin >> T; while (T--) { cin >> n >> m; if (m < n) swap(n, m); LL sum = 0; for (LL i = 1; i <= n; i++) { sum += ask(i); } cout << sum << endl; } return 0; }