【51Nod算法马拉松18 A】染色问题

来源:互联网 发布:淘宝销售宣传标语 编辑:程序博客网 时间:2024/06/04 19:08

Description

一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n),最终使得所有三个点构成的环(C(n,3)个不同的换)上三条边的颜色和在所有颜色中任选三种颜色的组合(C(n,3)种方案)一一对应,由你来给出染色方案。
本题有多组数据

Solution

看到这题一脸懵逼,看了好久都没看懂。
问了一下懂了的人,然后在第一个点有一个n=5的数据。
发现其构造很有规律。
打了一下,A了。
i连向j的颜色为(i+j-2)%n,如果前面的=0那么输出n。
首先如果n为偶数那么肯定是NO SOLUTION,因为一共有n(n1)2的边,每个颜色的出现边相等那么一种颜色就会(n1)2的边。
所以要求nmod21
那么现在用数学归纳法就可以证明结论,一个三元组的点通过变换就能变成一个三元组的颜色。

Code

#include<iostream> #include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;int i,j,k,l,t,n,m,ans,cas;int a[107][107];int main(){    for(scanf("%d",&cas);cas;cas--){        scanf("%d",&n);        printf("%d\n",n);        if(n%2==0) printf("No solution\n");        else{            memset(a,0,sizeof(a));            fo(i,1,n){                fo(j,i+1,n){                    k=(i-1+j-1)%n;if(!k)k=n;                    printf("%d %d %d ",i,j,k);                }            }            printf("\n");        }    }}
2 0