【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;
}
posted @ 2019-10-21 11:59  yjk  阅读(123)  评论(0编辑  收藏  举报