1 条题解

  • 0
    @ 2025-8-24 21:19:56

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Llf0703
    AFO

    搬运于2025-08-24 21:19:56,当前版本为作者最后更新于2019-07-28 11:58:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给出一个加法表,一个字母代表一个数字。求加法的进制,以及每个大写字母代表的数字。

    数字个数 N8N\le 8 。(行数 9\le 9

    题解

    结论:

    1. 一定是 NN 进制。
    2. 每一行有几个二位数,这个数就是几。

    证明:

    因为有 NN 个不同的数,所以最少 NN 进制。

    假设为 N+1N+1 进制,那么一定有一个数没有出现,假设为 kk

    1. k=0k=0k=1k=1,而 1+N=101+N=10 ,矛盾。
    2. 1<kN1 < k \le N ,而 1+(k1)=k1+(k-1)=k ,矛盾。

    其它 >N> N 进制的情况同理,所以一定是 NN 进制,结论 11 得证。

    数字为 0..N10..N-1 ,所以结论 22 显然。


    有上面的结论后这道题就很好做了。每个数的值都可以预处理出来,记为 ans[]ans[] ;同时把字母与数字的对应关系记为 mp[]mp[]

    然后枚举每个数,检验有没有矛盾,如果有就直接输出 ERROR 。最后把 ans[]ans[] 全部输出即可。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    inline int read()
    {
        char ch=getchar();
        int f=1,x=0;
        while (ch<'0' || ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
        while (ch>='0' && ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return f*x;
    }
    
    int n,ans[15],mp[26];
    char s[15][15][3];
    
    inline bool check(int x,int y) //检验 (x,y)
    {
        int sum=ans[x]+ans[y]; //和
        int cur=s[x][y][1]-'A'; //处理十位
        if (sum>=n-1 && mp[cur]!=1) return 0; //如果和 >=n-1 但没有进位
        if (sum>=n-1) sum-=n-1,cur=s[x][y][2]-'A'; //处理个位
        if (mp[cur]!=sum) return 0; //不相等
        return 1;
    }
    
    signed main()
    {
        n=read();
        for (int j=1;j<=n;j++) scanf("%s",s[1][j]+1);
        for (int i=2;i<=n;i++)
        {
            int cnt=0;
            for (int j=1;j<=n;j++)
            {
                scanf("%s",s[i][j]+1);
                cnt+=strlen(s[i][j]+1)>=2;
            }
            ans[i]=cnt;
            mp[s[i][1][1]-'A']=cnt;
        }
        for (int i=2;i<=n;i++) for (int j=2;j<=n;j++) if (!check(i,j)) return 0&puts("ERROR!");
        for (int i=2;i<=n;i++) printf("%c=%d ",s[i][1][1],ans[i]);
        return !printf("\n%d",n-1);
    }
    
    • 1

    信息

    ID
    15
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者