zoukankan      html  css  js  c++  java
  • 基准线

    联想公司推出一款新型显示屏。该显示屏由 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;
    }

    至于未来会怎样,要用力走下去才知道,先变成更喜欢的自己,再遇到一个不需要取悦的人,反正路还长,天总会亮!
  • 相关阅读:
    更改ORACLE_HOME_NAME
    Linux 查看裸设备大小
    Linux 日常操作
    Linux 高 wio 分析
    Linux 大页: HugePage 与transparent HugePage
    CentOS 8 配置本地YUM源
    MySQL 表压缩
    HIVE 处理json结构数据
    Emacs org-mode 2 文档结构
    CentOS 7 Oracle 19.3 单实例静默安装
  • 原文地址:https://www.cnblogs.com/huajizanfang12/p/5571395.html
Copyright © 2011-2022 走看看