YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

这个题目听完讲解感觉也就那么回事。

假设有两个点(x1,y1)和(x2,y2),a=x1-x2,b=y1-y2,那么如果说__gcd(a,b)==1,那么他们一定可以看到,具体为什么,我们可以根据三角形来解释

 

 

如果说a和b存在gcd,那么一定会存在a1和b1,a2,b2...,这也就是为什么a和b的gcd应该等于1。

 

另外如果两个学生可以看见,我们只关注这两个学生的相对距离就可以了,与这个学生具体在哪个位置没有关系。

 

所以我们可以枚举横向的差值和纵向的差值,如果gcd==1并且满足距离要求,那么他对答案的贡献就应该是(n-      i)*(n-j)(i表示横向差值,j表示纵向差值)
为什么是这样呢?

 

 

左下角的三角形可以向右移动两个,加上他自己就是3个,同理向上也是3个,因此对答案的贡献就是3*3=9个。

最后我们还需要*2,这样又是另外一种情况

code:

#include<bits/stdc++.h>
using namespace std;
const long long  MOD=1e9+7;
int main() {
    long long  n=1000;
    long long  k=500;
    long long  ans=n*(n-1);
    for(long long  i=1;i<n;i++){
        for(long long  j=1;j<n;j++){
            if(__gcd(i,j)!=1) continue ;
            if(i*i+j*j>k*k) continue ;
            ans=ans+(n-i)*(n-j)%MOD;
            ans=ans%MOD;
        }
    }
    ans=ans*2%MOD;
    cout<<ans<<endl;
    return 0;
}

 

posted on 2020-10-12 15:16  Target--fly  阅读(152)  评论(0编辑  收藏  举报