题意
小C偶然发现了一个奇妙的n个点的多边形。现在你需要给外圈的边标记上1~n-1,里圈的边也标记上1~n-1,使得对于一个外圈相邻点与中间点构成的三角形的边权之和都相等。
解题思路
以五边形为例
根据题意,我们可以得到
1+a+b=2+b+c –> a=1+c
2+b+c=3+c+d –> b=1+d
3+c+d=4+d+e –> c=1+e
4+d+e=5+e+a –> d=1+a
也就是b->d->a->c->e(5->4->3->2->1)
可以发现顺时针方向,b值取最大,从b开始,相隔一条线的值差为1,即,第k条线的值为x,则第(k+2)%n条线的值为x+1,即a[k]=a[(k+2)%n]+1。
所以,n个点的多边行,n必须为偶数。
参考代码
#include <iostream>
using namespace std;
int a[1000000+1];
int main(){
int n;
while (cin>>n){
n--;
if (n%2==0){
cout<<0<<endl;
continue;
}
int k=1,num=n;
while (1){
a[k]=num--;
if (k==n-1) break;
k=(k+2)%n;
}
for (int i=0;i<n-1;i++)
cout<<i+1<<" ";
cout<<n<<endl;
for (int i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
return 0;
}