基准线

联想公司推出一款新型显示屏。该显示屏由 n 行 m 列的点阵组成。任选点阵中两个点可以构造出一条“基准线”,质检员通过校正每条基准线上的像素信息来确保显示屏没有一丝一毫的缺陷。

现在,质检员想知道对于一个由 n 行 m列的点阵组成的显示屏而言有多少条不同的基准线。两条基准线不同当且仅当它们不重合,即两条基准线的交点数量是有穷的。

由于显示屏的基准线的数量会很多,为了简化我们只需要计算数量对 2^30取模后的结果。

输入格式

第一行有一个正整数 T为数据组数,接下来有 T行,每行两个正整数 n,m。

对于简单版本:T≤10,2≤n,m40;

对于中等版本:T≤10,000,2≤n,m≤4,000;

对于困难版本:T≤10,000,2≤n,m≤400,000。

输出格式

输出一共有 T行 ,每行一个整数,为该组数据的基准线数量。

样例输入

4
2 2
7 10
23 34
100 100

样例输出

6
1111
139395
22791174

O(n4​​) 枚举两个点,得到这两个点构成的直线方程,然后去重即可。

#include<bits/stdc++.h>
using namespace std;
const int q=pow(2,30);
inline int gcd(int x,int y)
{
 return y==0?x:gcd(y,x%y);
}
int solve(int n,int m)
{
 long long cnt=0;
 for(int i=1;i<n;i++)
 for(int j=1;j<m;j++)
 {
  if(gcd(i,j)==1)
  {
   cnt+=((n-i)*(m-j)-max(n-2*i,0)*max(m-2*j,0))%q;
   cnt%=q;
  }
 }
 return cnt;
}
int main()
{
 int t;
 cin>>t;
 while(t--)
 {
 int n,m;
 cin>>n>>m;
 cout<<solve(n,m)*2+n+m<<endl;
 }
 return 0;
}

至于未来会怎样,要用力走下去才知道,先变成更喜欢的自己,再遇到一个不需要取悦的人,反正路还长,天总会亮!
原文地址:https://www.cnblogs.com/huajizanfang12/p/5571395.html