A. Foregone Solution

题意:给你一个大于1小于1e100的整数(至少有一个数位的值是4),让你把它表示为两个正整数的和,并且这两个正整数的十进制表达中都不能包含数位4。保证有解

思路:每个数位可以独立的解决。

实现:设最后答案的两个数是a和b,然后把不是4的数位都分给a,把是4的数位拆成(1,3)或(2, 2) 分给a和b。因为题目保证至少存在一个数位位4,所以这样分a和b一定都是正整数。

官方题解:可以随机化!随机选择a,然后检查a和n-a是否合法

 

B. You Can Go Your Own Way

题意:在一个n*n的网格上,从左上角出发,只能向右或者向下走,经过2*n-2步到达右下角。题目给出了一个由Left(E,as in East)和Down(S,as in South)组成的路径prod,要求你给出一个路径dev,使得不存在在某一个点,dev和prod走了相同的方向。(即如果dev和prod同时经过了某个点,且dev走的下一步是E,那么prod必须走S,以此类推)

思路:关于对角线反置一下prod就好了

实现:读入prod,将E和S互换。

证明:通过上述构建方式得到dev,如果dev不合法,without the loss of generality,设第一次路径重合的地方是(a,b)-> (a,b+1)。由于这条边在dev中也存在,那么(b,a)-> (b+1, a)这条边在prod中也存在。我们不妨假设prod中,先走了(a,b)-> (a,b+1),后走了(b,a)-> (b+1, a),那么易知 (b,a)这个点是(a,b)之后经过的。所以有

b > a 且 a > b。矛盾

 

C. Cryptopangrams

题意:出题人随机选了26个不超过1e100的素数,按照从小到大排列,把每个素数分给起对应的字母,得到了一个由大写字母到这26个素数的一个bijection。然后出题人通过这个bijection对一段message加密,加密过程为

(1)把每个字符替换成其对应的素数,得到一个长度和message相同的整数数列,计为v[]

(2)生成一个长度为n-1的数字序列a[],其中a[i] = v[i] * v[i+1]

保证26字符每个都至少在message里出现一次。n不超过100,告诉你数列a[],让你求出原文。

思路:观察到,我们只要找出一个v[i],剩下的v[i]就可以通过某些a[x]和之前得到的v[y]作商得到。下面我们想怎么样可以找出一个v[i]。因为每个字符都出现一次,那么在message中一定存在i使得message[i] != message[i+2](否则,message只会由至多两种字符组成,因为奇数位都相同,偶数位也是),继而得到v[i] != v[i+2] -> v[i] * v[i+1] != v[i+2] * v[i+1],即a[i] != a[i+1]。然后v[i+1] = gcd(a[i], a[i+1])。

实现:

 1 import java.io.*;
 2 import java.util.*;
 3 import java.text.*;
 4 import java.math.*;
 5 public class Solution
 6 {
 7     public static void main(String args[])
 8     {
 9         Scanner stdin = new Scanner(System.in);        
10         int T = stdin.nextInt();
11         for (int kase = 1; kase <= T; ++kase)
12             {
13                 System.out.print("Case #" + Integer.toString(kase) + ": ");
14                 BigInteger N = stdin.nextBigInteger();
15                 int n = stdin.nextInt();
16                 BigInteger[] cipher = new BigInteger[n];
17                 BigInteger[] original = new BigInteger[n+1];
18                 for (int i = 0; i < n; ++i)
19                     {
20                         cipher[i] = stdin.nextBigInteger();
21                         // System.out.println(cipher[i]);
22                     }
23                 int tar = 0;
24                 for (tar = 0; tar < n-1 && cipher[tar].equals(cipher[tar+1]); ++tar);
25                 original[tar+1] = cipher[tar].gcd(cipher[tar+1]);
26                 for (int i = tar; i >= 0; --i) original[i] = cipher[i].divide(original[i+1]);
27                 for (int i = tar+1; i < n; ++i)
28                     original[i+1] = cipher[i].divide(original[i]);
29                 TreeSet<BigInteger> set = new TreeSet<BigInteger>();
30                 for (int i = 0; i < n+1; ++i)
31                     set.add(original[i]);                
32                 TreeMap<BigInteger, Character> mapping = new TreeMap<BigInteger, Character>();
33                 assert(set.size() == 26);
34                 char base = 'A';
35                 for (BigInteger code : set)
36                     {
37                         mapping.put(code, base);
38                         ++base;
39                     }
40                 for (int i = 0; i < n+1; ++i)
41                     System.out.print(mapping.get(original[i]));
42                 System.out.println();
43             }
44     }
45 };
View Code

相关文章:

  • 2021-05-20
  • 2022-02-12
  • 2022-12-23
  • 2022-12-23
  • 2021-12-19
  • 2021-09-01
  • 2022-02-12
  • 2021-07-12
猜你喜欢
  • 2022-12-23
  • 2021-08-27
  • 2022-03-01
  • 2022-12-23
  • 2021-12-24
  • 2021-06-21
  • 2021-07-11
相关资源
相似解决方案