hdu4279

/*
分析:
    显然的打表找规律。
    打表后可以发现(用0表示该位置的数不是real number,1表示是)串为:
    00000 1个“10”+111 2个“01”+000 3个“10”+111 4个“01”+000...
    然后答案推一下就出来了。

                                                              2013-10-15
*/






#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
const unsigned __int64 limit=3037000498;

unsigned __int64 solve(unsigned __int64 x)
{
	unsigned __int64 ans,low,mid,up,temp;
	low=1;up=limit;
	while(low<=up)
	{
		mid=(low+up)>>1;
		temp=mid*mid+4*mid;
		if(temp<=x)	low=mid+1;
		else		up=mid-1;
	}
	low--;
	ans=low*(low+1)/2 + (low/2 + low%2)*3;
	temp=x-(low*low+4*low);
	if(!temp)	return ans;
	if(temp<=(low+1)*2)
	{
		if((low+1)%2)	ans+=temp/2 + temp%2;
		else			ans+=(temp-1)/2 + (temp-1)%2;
	}
	else
	{
		ans+=low+1;
		if((low+1)%2)	ans+=temp-(low+1)*2;
	}
	return ans;
}
int main()
{
	int T;
	unsigned __int64 a,b,ans[2];
	cin>>T;
	while(T--)
	{
		scanf("%I64u%I64u",&a,&b);
		if(b<=5)	{printf("0\n");continue;}
		if(a<=6)a=0;
		else	a-=6;
		b-=5;

		ans[0]=solve(a);
		ans[1]=solve(b);

		printf("%I64u\n",ans[1]-ans[0]);
	}
	return 0;
}


你可能感兴趣的:(各种水,regional&&multi)