T1
/*
思路:计算出数列中每两个元素之间的绝对差,对于每个绝对差,将其与
1~n-1 依次比较,若有一个相等则将当前差标记,最后统计1~n-1是否
均被标记即可。
*/
#include<bits/stdc++.h>
using namespace std;
int n,a[1031];
bool vis[1031]; //标记数组
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	for(int i=2;i<=n;i++){
		int c=abs(a[i]-a[i-1]); //计算绝对差
		for(int j=1;j<n;j++)  //依次比较
			if(c==j) vis[c]=1; //标记差
	}
	
	bool f=1;
	for(int i=1;i<n;i++) //检查是否均被标记
		if(!vis[i]) f=0;
	if(f) cout<<"Jolly";
	else cout<<"Not jolly";
	return 0;
}
T2
/*
思路:四重循环枚举c骰子的四个数,依次检验a->b,b->c,c->a或a->c,c->b,b->a是否成立(x->y表示x能击败y);
具体地,对于两个骰子x,y,我们循环两个骰子上的数xi和yj,一一比较,统计xi>yj的数量和yj>xi的数量,比较其大小即可。 
*/
#include<bits/stdc++.h>
using namespace std;
int T;
int aa[4],bb[4],cc[4]; //a,b,c三个骰子 
bool beat(int *x,int *y){ //检验x->y是否成立 
	int cnt1=0,cnt2=0; //计数器 
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++){
			if(x[i]>y[j]) cnt1++; //xi>yj
			if(y[j]>x[i]) cnt2++; //yj>xi
		}
	return cnt1>cnt2; //若cnt1>cnt2说明能击败,否则不能 
}
bool check(int *x){
	if(beat(aa,bb)&&beat(bb,cc)&&beat(cc,aa)) return 1; //a->b,b->c,c->a,返回1 
	if(beat(aa,cc)&&beat(cc,bb)&&beat(bb,aa)) return 1; //a->c,c->b,b->a,也返回1 
	return 0; //否则返回0 
}
string solve(){
	for(int a=1;a<=10;a++) //四重循环枚举 
		for(int b=1;b<=10;b++)
			for(int c=1;c<=10;c++)
				for(int d=1;d<=10;d++){
					cc[0]=a,cc[1]=b,cc[2]=c,cc[3]=d;
					if(check(cc)) return "yes\n"; //只要找到一个合法的就返回yes 
				}
	return "no\n"; //否则返回no 
}
int main(){
    cin>>T;
    while(T--){
    	for(int i=0;i<4;i++) cin>>aa[i];
    	for(int i=0;i<4;i++) cin>>bb[i];
		cout<<solve();
	}
    return 0;
}
T3
/*
思路:使用埃氏筛筛出2~5000内的质数表,循环m~n,
对于区间内的每一个数x在质数表中进行倒序查询,
若当前的质数pi能整除x,则将x加入数组中,
最后输出数组即可,要存到数组中是因为需要特殊处理逗号。
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,tp; //n,m,质数表大小,答案数组大小
bool v[5031]; //埃氏筛标记数组
int p[5031],pp[5031]; //质数表和答案数组
//string ans;
void Esh(){ //埃氏筛模板
	for(int i=2;i<=5000;i++)
		if(!v[i])
			for(int j=i*i;j<=5000;j+=i) v[j]=1;
	for(int i=2;i<=5000;i++)
		if(!v[i]) p[++tot]=i;
}
int main(){
	cin>>m>>n; //注意n,m输入顺序
	Esh();
	//cout<<tot<<'\n';
	//for(int i=1;i<=tot;i++) cout<<p[i]<<' ';
	
	for(int i=m;i<=n;i++){ //遍历m~n区间
		for(int j=tot;j>=1;j--){ //倒序查询质数表
			if(i%p[j]==0){ //若能整除i
				pp[++tp]=p[j]; //存入答案数组
				break;	
			}
		}
	}	
	for(int i=1;i<=tp;i++){
		cout<<pp[i];
		if(i<tp) cout<<','; //特判逗号
	}
	return 0;
}
T4
/*
思路:依题意模拟即可,注意需要跳过刚才被放完的歌。
*/
#include<bits/stdc++.h>
using namespace std;
int n,t;
int r[1031];
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++) cin>>r[i];
	for(int i=1;i<=t;i++){
		int maxn=-1e9,maxid; //找权值最大的
		for(int i=1;i<=n;i++)
			if(maxn<r[i])
				maxn=r[i],maxid=i;
		cout<<maxid<<'\n'; //输出权值最大的下标
		r[maxid]=0; //清零
		for(int i=1;i<=n;i++) //对于不是刚才听过的歌的权值加上maxn/(n-1)
			if(i!=maxid) r[i]+=maxn/(n-1); 
		maxn%=(n-1); //求得余数
		for(int i=1;maxn;i++) //从1开始顺次将余数分配
            if(i!=maxid) r[i]++,maxn--;
		//for(int i=1;i<=n;i++) cout<<r[i]<<' ';
		//cout<<'\n';
	}
	return 0;
} 
T5
/*
思路:枚举不重复的三元组,对于每个三元组进行判断,若返回1则令答案累加即可;
具体地,我们对于一个三元组(x,y,z),首先枚举n个有斑点的牛,依次将列坐标为(x,y,z)的字符拼接在一起,在map中记录;
接着枚举n个无斑点的牛,同样依次将列坐标为(x,y,z)的字符拼接在一起,判断是否被记录过,若是则返回0,否则返回1。 
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,num[31];
int a[531][131],b[531][131];
bool vis[31][31][31]; //标记数组 
 //字符矩阵,包括有斑点的牛和无斑点的牛 
bool check(int x,int y,int z){ //检查三元组(x,y,z)是否合法 
	memset(vis,0,sizeof(vis)); //注意清空 
	for(int i=1;i<=n;i++)
	    vis[a[i][x]][a[i][y]][a[i][z]]=1;
	for(int i=1;i<=n;i++)
	    if(vis[b[i][x]][b[i][y]][b[i][z]])
	        return 0;
	return 1; //否则返回1 
}
int main(){
	cin>>n>>m;
	num['A']=0,num['C']=1,num['G']=2,num['T']=3;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
		    char c; cin>>c; a[i][j]=num[c];
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
		    char c; cin>>c; b[i][j]=num[c];
		}
	for(int i=1;i<=m;i++) //枚举三元组 
		for(int j=i+1;j<=m;j++)
			for(int k=j+1;k<=m;k++)
				if(check(i,j,k)) ans++; //若合法则累加 
	cout<<ans;
	return 0;
}