hdu 2554 N对数的排列问题(数论:难题...但是可以蒙对)

想不出来,就随便变了一个公式n*(n+1)/2%2

代入2 3 4 5结果正确后就交了...然后就过了尴尬

看了别人的证明才知道自己的为什么是对的....

//----------------------------------------------------------------------

本题相当于n对数,2*n个位置来放这2*n个数。

现在我们假设数k放的第一个位置是ak,第二个位置为bk,默认ak在前面。

则有:bk-ak=k+1,这样s(bk-ak) = n*(n+1)/2+n = n*(n+3)/2

而对于他们本身有s(bk+ak)=n*(2*n+1)

所以可以解得:s(ak)=n*(3*n-1)/4  s(bk)=5*n*(n+1)/2

由于sigma(bk)肯定是整数,现在只需要sigma(ak)为整数就可以了,所以只需要

n%4==0或者(3*n-1)%4==0

//-----------------------------------------------------------------------

那么为什么我的公式正确呢?把n=4*k || n=4*k+1代入即可证明

代码如下:

#include <stdio.h>

int main(void) {
    int n;
    while(scanf("%d", &n), n) {
        n = n*(n+1)/2%2;
        if(n) printf("N\n");
        else printf("Y\n");
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值