HDU 2608解题报告

0 or 1

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2804    Accepted Submission(s): 730


Problem Description
Solving problem is a interesting thing. Yifenfei like to slove different problem,because he think it is a way let him more intelligent. But as we know,yifenfei is weak in math. When he come up against a difficult math problem, he always try to get a hand. Now the problem is coming! Let we
define T(n) as the sum of all numbers which are positive integers can divied n. and S(n) = T(1) + T(2) + T(3)…..+T(n). 
 

Input
The first line of the input contains an integer T which means the number of test cases. Then T lines follow, each line consists of only one positive integers n. You may assume the integer will not exceed 2^31.
 

Output
For each test case, you should output one lines of one integer S(n) %2. So you may see the answer is always 0 or 1 .
 

Sample Input
  
  
3 1 2 3
 

Sample Output
  
  
1 0 0
Hint
Hint S(3) = T(1) + T(2) +T(3) = 1 + (1+2) + (1+3) = 8 S(3) % 2 = 0
 

Author
yifenfei
 

Source
 

Recommend
yifenfei   |   We have carefully selected several similar problems for you:   2609  2617  2612  2610  2606 

         这道题属于简单的数论题,但是也有一定的技巧性。题目中的T(n)相当于是n的所有约数之和,S(n)是T(1)~T(n)之和。根据数的唯一分解定理可以得到,n=(2^x1)*(p2^x2)*……*(pk^xk)将n分解质因数。则T(n)=(1+2+2^2+……+2^x1)*(1+p2+……+p2^x2)*……*(1+pk+……+pk^xk)。含有2的多项式之和必然为奇数。而对于后边的多项式,由于pk是n的质因数,且必为奇数。要保证k个多项式之积都为奇数,那么只有所有的多项式均为奇数才行。则x2,x3……xk必须都为偶数。则T(n)就可以写成(2^a)*(x^2)。所以当T(n)=2*(x^2)或者T(n)=x^2。要求S(n)的大小就要求出在1~n中有多少个x^2,有多少个2*x^2。个数分别为(int)sqrt(n)和(int)sqrt(n/2)。千万要注意强制转换。

        本题要深刻理解整数的唯一分解定理这些基本的数论知识才能比较容易的推出结论。打表也可以,但不一定每个人都能看出这个规律。

        参考代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<ctime>
#include<cstdlib>
#include<iomanip>
#include<utility>
#define pb push_back
#define mp make_pair
#define CLR(x) memset(x,0,sizeof(x))
#define _CLR(x) memset(x,-1,sizeof(x))
#define REP(i,n) for(int i=0;i<n;i++)
#define Debug(x) cout<<#x<<"="<<x<<" "<<endl
#define REP(i,l,r) for(int i=l;i<=r;i++)
#define rep(i,l,r) for(int i=l;i<r;i++)
#define RREP(i,l,r) for(int i=l;i>=r;i--)
#define rrep(i,l,r) for(int i=1;i>r;i--)
#define read(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<11
using namespace std;

int main()
{
   int t,n;
   read(t);
   while(t--)
   {
       read(n);
       int s=(int)sqrt(n*1.0)+(int)sqrt(n/2.0);
       printf("%d\n",(s&1));
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值