hdu 2608(数论)

点击打开链接


题意:

T(n)表示能够被n整除的所有数字和,S(n)=T(1)+T(2)+...+T(n);

S(n)%=2;




列出前100项,可以发现有两种转换0->1     1->0

并且可以发现转换的位置要么帅平方数要么帅平方数的二倍,

所以可以先求出2^31内的所有平方数及其二倍,然后判断n是在哪个范围内的。。。


#include"stdio.h"
#include"string.h"
#include"algorithm"
#define N 100000
using namespace std;
typedef __int64 LL;

LL A[N];
int cnt;

void fun()
{
	int i,j;
	cnt=0;
	for(i=1;i<=46368;i++)
		A[cnt++]=i*i;
	j=cnt;
	for(i=0;i<j;i++)
		A[cnt++]=2*A[i];
	sort(A,A+cnt);
}
int main()
{
	int T;
	int n;
	int i;
	fun();
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=0;i<cnt;i++)
		{
			if(n>=A[i]&&n<A[i+1])
			{
				printf("%d\n",i%2==0?1:0);
				break;
			}
		}
	}
	return 0;
}




你可能感兴趣的:(数学)