hdu 2608

本文通过分析数论中特定求和问题,揭示了数N的因子和T(N)的奇偶特性及其规律,并提供了两种不同的算法实现方案。

【题意】

给定数N,求S(N)%2,其中S(N)=T(1)+T(2)+……+T(N),其中T(N)表示数N的因子和。

 

【前话】

队友推荐的这一题,当时想的是可以寻规律,打了个长度为N的表,压根没发现什么规律,不过却发现T(N)的一个特点,N=124891618253236495064……时T(N)%2==1,其余的都是0,结果见下表。

T(N)%2  1……

S(N) 0……

S(N)= S(N-1)^(T(N)%2)

 

【分析】

我后来列了N=10

1

2

3

4

5

6

7

8

9

10

注意到不要单行相加,按列来加,有10152332451678910,看到这里,我立刻就醒过省来了,和fzu1988求个数如出一辙(见我的上一篇文章)。

10/1=1010/10=1, s+= 10;

10/2=510/5=2,  s+= 5*2;

10/3=310/3=3s+= 3*3;

10/4=210/2=5s+= (4+5)*2; //按区间算;

10/6=110/10=1s+= (6+7+8+9+10)*1;//按区间算;

 

【后话】

交完125MS,只有百度看那些0MS的怎么写,结果是吓一跳,别人打表到50就出了规律,话说我的打到10000我也没怎么看出,Orz

凡是能够被完全开方或者2整除后能够完全被开方的数,它的 (T(N) 2) 都是 

 

三、代码

 

 

#include<stdio.h>

int Count(int x)

{

    if(x==1) return 1;

    int i,j,w,m,s=x;

for(i=2;i<=x;) 

{

        w=x/i;

        m=x/w;

        if(m==i) i++, s+= (w*m)%2, s%=2;

        else 

        {

            int t=(i+m)*(m-i+1)/2; //连续区间,等差求和;

            s+= (t*w)%2;

            s%=2; 

            i= m+1;

           

       

    return s;    

}

int main()

{

    int T,n;

    scanf("%d",&T);    

    while(T--){

        scanf("%d",&n);  

        printf("%d\n",Count(n));

    }

 

【参考代码1

#include <stdio.h>  

//数为1的是某数的平方或某数平方的2倍,之前结果之和取余2

#include<math.h>

int main(){

    int t,sum;long long n,i,k;

    scanf("%d",&t);

    while(t--){

         scanf("%I64d",&n);

         sum=k=sqrt(n);

         for(i=1;i<=k;i++)

         {

             if(i*i*2<=n)sum++;

         }

         sum=sum%2;

         printf("%d\n",sum);

     }

     return 0;

}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值