HDU 2554-N对数的排列问题

N对数的排列问题

思路:设ai为第i个宝宝第一次出现的位置,bi是他第二次出现的位置,则bi-ai=i+1;

∑(bi-ai) = 2+3+4+...+n+1=(n+3)*n/2;①

∑(ai+bi) = 1+2+3+...+2*n=(2*n+1)*n;②

②-①得:

2∑ai = (3*n2 -n)/2;

∑ai = (3*n-1)*n/4;

因为ai都为整数,所以 ∑ai也为整数。

所以只要满足(3*n-1)%4==0||n%4==0就是Y,否则是N。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset((a),(b),sizeof(a))
const int INF=0x3f3f3f3f;

int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        if(n%4==0||(3*n-1)%4==0)printf("Y
");
        else printf("N
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/widsom/p/7298709.html