【luoguP2997】[USACO10NOV]旗帜Banner
长和宽的gcd(x,y)=1,就没有中间结点,一种线段有两种方向,暴力统计一下就好了
注意x=0或y=0时的线段只有一种方向
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
int L1,L2,W,H,ans;
inline int gcd(int a,int b){
if(!b) return a;
return gcd(b,a%b);
}
signed main()
{
scanf("%lld%lld%lld%lld",&W,&H,&L1,&L2);
for(int i=0;i<=W;++i)
for(int j=0;j<=H;++j){
double len=sqrt(i*i+j*j);
if(gcd(i,j)==1&&L1<=len&&len<=L2){
if(i==0||j==0) ans+=(W-i+1)*(H-j+1);
else ans+=(W-i+1)*(H-j+1)*2;
}
}
printf("%lld\n",ans);
return 0;
}