找出幺元和逆元
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
设I为整数集,定义二元运算*的运算为a*b = a+b-k,其中k为输入的整数,a,b是集合I内的数,求代数系统V=< I, * >幺元和逆元。
Input
多组输入,每次输入两个正整数k(0<=k<100)和q(0<=q<100),k为题目中的k,q代表q次询问,之后输入q个整数x(0<=x<100).
Output
第一行输出幺元
接下来输出q行,为对应的x的逆元。
Sample Input
25 2
1
3
5 3
4
3
0
Sample Output
25
49
47
5
6
7
10
#include<stdio.h>
int main()
{
int k,i,a[100],b[100],q;
while(~scanf("%d %d",&k,&q))
{
printf("%d\n",k);
for(i=1; i<=q; i++)
{
scanf("%d",&a[i]);
b[i]=2*k-a[i];
}
for(i=1; i<=q; i++)
{
printf("%d\n",b[i]);
}
}
return 0;
}
群的判定
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
设D为非负子数集,二元运算+为模M加法。现给定D和M,问代数系统V=< D, + >是否构成群,如果是,那么求给定元素的逆元。
Input
多组测试数据,对于每组测试数据,第一行三个数N(1 <= N <= 100)、M(1 <= M <= 100)和Q(1 <= 100 <= Q)。其中N为S中元素个数(元素可能有重复,请自行去重),M如上所述,Q为询问个数。接下来一行,n个数 x(0 <= x < 100),表示S中的元素。接下来Q行,每行一个数y(0 <= y < 100),表示询问y的逆元。
Output
如果V不构成群,只要输出一个-1。
否则,输出Q行,每行一个数,对应一个询问的逆元。
Sample Input
8 7 1
0 6 3 6 1 2 4 5
2
3 4 2
0 2 3
0
3
Sample Output
5
-1
Hint
模M加法举例如下:例如模7加法,3+6=2,5+2=0,即答案为带余除法的余数。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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) != EOF)
{
int f=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]);
vis[arr[i]]=1;
}
for (int i=1; i<=q; i++)
{
scanf("%d", &b[i]);
}
if (vis[0]==0)
{
f=0;
}
num[0]=0;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (vis[(arr[i]+arr[j])%m]&&(arr[i]+arr[j])%m==0)
{
num[arr[i]]=arr[j];
num[arr[j]]=arr[i];
break;
}
}
}
for (int i=1; i<=n; i++)
{
if (num[arr[i]]==-1)
{
f=0;
}
}
if (!f)
{
printf("-1\n");
}
else
{
for(int i=1; i<=q; i++)
{
printf("%d\n", num[b[i]]);
}
}
}
return 0;
}
/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 200KB
Submit time: 2019-06-06 11:03:29
****************************************************/
#include <stdio.h>
#include <string.h>
int main ()
{
int n,m,k;
int a[110],b[110],c[110],d[110];
while (~scanf("%d %d %d",&n,&m,&k))
{
int lan =0; int len =0; //作为判断条件
memset(b,-1,sizeof b);
memset(d,-1,sizeof d);
for( int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
b[a[i]]=1; //记录数据是否存在
if(a[i]==0)lan=1; //确定幺元
}
for( int i=1; i<=k; i++)scanf("%d",&c[i]);
d[0]=0;
//找逆元
for( int i=1; i<n; i++)
{
for(int j=1+i; j<=n; j++)
{
if(b[(a[i]+a[j])%m]==1&&((a[i]+a[j])%m)==0)
{
d[a[i]]=a[j];d[a[j]]=a[i];
}
}
}
//判断是否都存在逆元
for( int i=1; i<=n; i++)
{
if(d[a[i]]==-1)len=1;
}
if( lan==0||len==1) printf("-1\n");
else
{
for( int i=1; i<=k; i++)
{
printf("%d\n",d[c[i]]);
}
}
}
return 0;
}
判断子群
判断子群
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
/**
* 题目中已说s是有限群 所有不必管s的数据只要判定s1是否构成群即可
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[101];// 存放群s的数据
int b[101];// 存放群s1数据
int c[101];// 存放群s1内元素的逆元(不存在逆元 就不能构成群)
int n,M,m,i,j,f;
while(scanf("%d %d %d",&n,&M,&m)!=EOF)
{
memset(c,-1,sizeof(c));
f=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&b[i]);
if(b[i]==0)f=1; // 要想s1是群 0必须存在
}
c[0]=0;// 0的逆元是0
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{// 在群中找每个元素的逆元 即 元素i 和 元素j 都在群中 且
// i+j%m==0
if(f==1&&(b[i]+b[j])%M==0)
{
c[b[i]]=b[j];
c[b[j]]=b[i];
break;
}
}
}
for(i=1;i<=n;i++)// 要想成群 每个元素都有逆元
{
if(c[b[i]]==-1)
f=0;
}
if(f==0)printf("NO\n");
else printf("YES\n");
}
return 0;
}