题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2608
好像有人用打表也过了。我是借鉴别人写了一半的推导公式推导出来的:
用数论推出规律来:
(1):若n为奇数且为平方数,则T(n)=1;
(2):若n为奇数且不为平方数,则T(n)=0;
(3):若n为偶数,则n可表示为:
n=2^p*X(X为奇数)
T(n)=T(2^p*X)=(T(X)+2*T(X)+2^2*T(X)+.......+2^p*T(X))=T(X)*(2^(p+1)-1)
1)若X为(1),则T(n)=1;
2)若X为(2),则T(n)=0;
3)若p为偶数,则当X为(1)时,T(n)=1,否则T(n)=0->若n为偶数且为平方数时,T(n)=1;
3)若p为奇数,则p-1为偶数,则T(n)=T(X)*(2^p-1)+2^p*T(X),若X为(1),则T(n)=1,否则T(n)=0,->若n为偶数,且n为平方数的2倍时,T(n)=1;
综上:若n为平方数或是平方数的2倍时,则T(n)=1,否则T(n)=0;
好了,给出我的AC代码吧:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
int T;
cin >> T;
while (T--){
cin >> n;
int a, b;
int c1 = (int)sqrt((double)n);
int d = (c1*c1);
int c2 = c1;
while (d * 2 > n){
c2--;
d = c2*c2;
}
a = n - c1 - c2;
b = c1 + c2;
cout << (b % 2) << endl;
}
return 0;
}