BZOJ2523/LOJ2646 聪明的学生

BZOJ2523/LOJ2646 聪明的学生

第一道CTSC的题。
因为是思维题,所以思路就不写了。直接看代码吧。

#include<bits/stdc++.h>
#define M 30010

using namespace std;

int n,m,p,cnt;
int a[3],pre[3]={2,0,1},nxt[3]={1,2,0};

struct node {
    int a,b,c;
}ans[M];

bool cmp(node x,node y) {
    if(x.a!=y.a) {
        return x.a<y.a;
    }
    if(x.b!=y.b) {
        return x.b<y.b;
    }
    return x.c<y.c;
}

int Check(int x,int y,int p) {
    if(x==y) {
        return p+1;
    }
    return x>y?Check(y,x-y,nxt[p])+2:Check(y-x,x,pre[p])+1;
}

void Init() {
    memset(ans,0,sizeof(ans));
    cnt=0;
    p=0;
    return;
}

void Solve() {
    p=(n-1)%3;
    for(int i=1;i<=m-1;i++) {
        int j=m-i;
        if(Check(i,j,p)==n) {
            a[p]=m;
            a[nxt[p]]=i;
            a[pre[p]]=j;
            ans[++cnt]=(node){a[0],a[1],a[2]};
        }
    }
    return;
}

void Print() {
    printf("%d\n",cnt);
    sort(ans+1,ans+cnt+1,cmp);
    for(int i=1;i<=cnt;i++) {
        printf("%d %d %d\n",ans[i].a,ans[i].b,ans[i].c);
    }
    return;
}

void Work() {
    Init();
    Solve();
    Print();
    return;
}

int main()
{
    while(scanf("%d%d",&n,&m)&&(!(n==-1&&m==-1))) {
        Work();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/luoshui-tianyi/p/12020094.html