P12497 回文括号序列
思路
若数
若数
首位必为 (,末位必为 )。
其间余空位
分之为二部,)(,()。
其
今证此构造之法合法:
左部所置 )( 中,凡右括恒能与前者 )( 之左括相配,或与首左括相配;凡左括恒可与后者 )( 之右括相配,或与末右括相配。
右部所置 () 显然合法。
左部左括恒与右部左括相应,右部亦然。惟当
是时,
综上,此构造之法合法,又可极
现代文版本
当
当
首先位置 (,位置 )。
中间有
将其分成两半,)(,()。
其中,
接下来证明这样构造的
左半边放置的 )( 中,右括号总能与上一个放置的 )( 中的左括号匹配,或与第一个左括号匹配;左括号总能与下一个放置的 )( 中的右括号匹配,或与最后一个右括号匹配。
右半边放置的 () 显然合法。
左半边的左括号总能与右半边的左括号对应,右半边同理。除了当
此时
综上,此构造方案合法,且可最大化
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n;
inline int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
return ret*f;
}
void _solve(){
n=read();
if(n&1){
printf("-1\n");
return;
}
printf("(");
for(int i=1;i<=(n-2)>>1;i++){
if(i<=(n-2)>>2)printf(")(");
else printf("()");
}
printf(")\n");
}
signed main(){
T=read();
while(T--)_solve();
return 0;
}