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;
}
posted @ 2019-12-11 00:41  WalkerV  阅读(177)  评论(0编辑  收藏  举报