hdu 2608 0 or 1

题目:hdu 2608 0 or 1

题意:定义 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值