离散上机实验三

找出幺元和逆元

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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

Submit Statistic

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

Submit Statistic

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;
}

 

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值