比赛 20110923 评测结果 AWWEEEEEEE
题目名称 横幅 最终得分 10
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-09-23 21:29:49
显示代码纯文本
#include <fstream>
#include <cmath>

#define I_F "banner.in"
#define O_F "banner.out"

const int MAXn=1000;

int primes[MAXn];
int pn;

int w,h,l1,l2;
long long ans;

void Getprimes();
void Input();
inline bool Hz(const int, const int);
inline bool Len(const int, const int, const int, const int);
long long K(const int);
void Search();
void Output();

int main()
{
	Getprimes();
	Input();
	Search();
	Output();
	return 0;
}

void Getprimes()
{
	pn=1;
	primes[0]=2;
	bool flag;
	for (int i=3; i<MAXn; i+=2)
	{
		flag=true;
		for (int j=0; (flag)&&(j<pn)&&(primes[j]<=sqrt(i)); j++)
			if (i%primes[j]==0)
				flag=false;
		if (flag)
			primes[pn++]=i;
	}
}

void Input()
{
	std::ifstream fin(I_F);
	fin>>w>>h>>l1>>l2;
	fin.close();
	if (w<h)
	{
		w+=h;
		h=w-h;
		w-=h;
	}
}

inline bool Hz(const int a, const int b)
{
	if (a==0)
		if (b==1)
			return true;
		else
			return false;
	int m=(a<b)?a:b;
	for (int i=0; (i<pn)&&(primes[i]<=sqrt(m)); i++)
		if (a%i==b%i)
			return false;
	return true;
}

inline bool Len(const int x1, const int y1, const int x2, const int y2)
{
	float t=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	return (t>=l1)&&(t<=l2);
}

long long K(const int m)
{
	long long t=0;
	for (int i=0; i<h/2; i++)
		for (int j=0; j<h; j++)
			if (Hz(i-j,m) && Len(0,i,m,j))
				t++;
	t*=2;
	if (h%2>0)
		for (int j=0; j<h; j++)
			if (Hz(h/2-j,m) && Len(0,h/2,m,j))
				t++;
	return t;
}

void Search()
{
	ans=0;
	h++;
	for (int i=1; i<=w; i++)
		ans=ans*2+K(i);
	if (l1<=1)
		ans+=(h-1)*(w+1);
}

void Output()
{
	std::ofstream fout(O_F);
	fout<<ans<<std::endl;
	fout.close();
}