判断子群
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定一个有限群S,和他的一个子集S1,定义S上的二元运算*为模M加法运算,判断该子集是否为S的子群。(子群的定义:设H为群G的非空子集。如果H在G的运算下构成群,则称H为G的子群)
Input
多组输入,第一行为有限群S的元素个数n(0<=n<100),数M(0<=M<100),其子集的元素个数m(0<=m<100)(元素可能有重复)
第二行n个数为有限群含有的元素x(0 <= x < 100),第三行m个数为子集含有的元素y(0 <= y < 100)。
输出
如果该子集是S的子群输出“YES”,反之输出“NO”(不含引号)
Output
如果该子集是S的子群输出“YES”,反之输出“NO”(不含引号)
Sample Input
8 7 7 0 1 2 3 4 5 6 6 0 1 2 3 4 5 6 10 7 7 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 9
Sample Output
YES NO
#include<stdio.h>
#include <string.h>
#define ll long long
int arr[110];
int vis[110];
int num[110];
int b[110];
int main()
{
int n, m, q;
while(~scanf("%d %d %d", &n, &m, &q))
{
int flag = 1;
memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
memset(num,-1,sizeof(num));
memset(arr,-1,sizeof(arr));
for(int i = 1; i <= n; i++)
{
scanf("%d", &arr[i]);
}
for(int i = 1; i <= q; i++)
{
scanf("%d", &b[i]);
vis[b[i]] = 1;
}
if(vis[0]==0)
{
flag = 0;
}
num[0] = 0;
for(int i = 1; i <= n; i++)
{
for(int j = i+1; j <= n; j++)
{
if(vis[(b[i] + b[j]) % m] && (b[i] + b[j]) % m == 0)
{
num[b[i]] = b[j];
num[b[j]] = b[i];
break;
}
}
}
for(int i = 1; i <= n; i++)
{
if(num[b[i]] == -1)
{
flag = 0;
}
}
if(!flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}