题意:定义 T(n) 表示 n 内所有约数的和,S(n)表示 T(1)+...+T(n) , 求 S(n)%2
思路:
开始的时候,我想的基本上不对吧,将每个T(n)的元素罗列出来,发现总的S(n)的值应该是等于 n/1 + n/2 * 2 + n/3 * 3 + .... + n/n * n 的值(这里的除是整除),然后对于除后乘上偶数项的,我们不予考虑,对于奇数项的,我尝试头尾元素进行搭配,结果发现不行,没规律。
正确的想法应该是对于每个T(x) , 我们将 x 质因数分解,得到 x = 2^x2 * 3^x3 * ... * pi^xi 所以T(x) 的值为所有约数的和应该是 (1+2+2^2+ .. + 2^x2)*(1+3+3^2+....)*....*(1+pi+pi^2+...+pi^xi) 对于第一个括号里(2^(x2+1)-1)的取余的结果始终为1,不予考虑,对于后面的括号里的,公比均是质数且奇数,如果存在一个xi%2==0 , 那么整个式子%=1,所以取余等于1的T值,肯定满足x=2^k*a^b ( b%2==0)
因此x换成通式的情况就是 x = 2*(a^2)或者 x = a^2
现在要求得S(n)为T(n) 的前n项和,根据上面的通式,我们可以考虑出现次数为 sqrt(n) + sqrt(n/2)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
long long n;
int t;
cin>>t;
while(t--)
{
cin>>n;
int ans=(int)sqrt(n)+(int)sqrt(n/2.0);
if(ans&1)
cout<<1<<endl;
else
cout<<0<<endl;
}
return 0;
}