2 条题解

  • 0
    @ 2026-9-2 10:54:54

    题面很好理解,不再赘述。

    解题思路

    依题知,明文标号为 MM,密文标号为 CC,密钥标号为 kk

    我们观察运算 ®® 的规则表可以发现,如果我们将 AA 标作 11BB 标作 22CC 标作 33,以此类推,那么 (M+k)mod26C(M + k) \bmod 26 \to C。对应的,如果 Ck0C - k \ge 0,则 MCkM \to C - k。反之,MCk+26M \to C - k + 26

    密文位数和密钥位数的对应关系是非常显然的,直接用密文的当前位数取模于密钥的总位数就可以得到密钥的当前位数了。

    代码

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    char k[110];
    char m[1100];
    int ks[110];
    char ms;
     
    int main() {
    	cin >> k >> m;
    	int j;
        //预处理密钥
    	for (j = 0; k[j]; ++j) {
    		ks[j] = (k[j] >= 'a' ? k[j] - 'a' : k[j] - 'A');
    	}
    	for (int i = 0; m[i]; ++i) {
    		if (m[i] >= 'a') {
    			ms = (m[i] - 'a' - ks[i % j] >= 0 ? m[i] - ks[i % j] : m[i] - ks[i % j] + 26);
    		}
    		else {
    			ms = (m[i] - 'A' - ks[i % j] >= 0 ? m[i] - ks[i % j] : m[i] - ks[i % j] + 26);
    		}
    		printf("%c", ms);
    	}
    	return 0;
    } 
    
    • 0
      @ 2025-10-8 16:53:12
      #include <bits/stdc++.h>
      using namespace std;
      char a[5600], b[56000];
      int main() {
          scanf("%s", a + 1);
          scanf("%s", b + 1);
          int alen = strlen(a + 1), blen = strlen(b + 1);
          for (int i = 1; i <= alen; i++) {
              if (a[i] >= 'A' && a[i] <= 'Z') a[i] = a[i] - 'A' + 1;
              else a[i] = a[i] - 'a' + 1;
          }
          for (int i = 1; i <= blen; i++) {
              int c = a[(i - 1) % alen + 1];
              if (b[i] >= 'A' && b[i] <= 'Z') {
                  c = b[i] - 'A' + 1 - c;
                  if (c < 0) c += 26;
                  printf("%c", 'A' + c);
              } else {
                  c = b[i] - 'a' + 1 - c;
                  if (c < 0) c += 26;
                  printf("%c", 'a' + c);
              }
          }
          printf("\n");
          return 0;
      }
      
      • 1

      信息

      ID
      69
      时间
      1000ms
      内存
      128MiB
      难度
      1
      标签
      递交数
      47
      已通过
      36
      上传者