字节跳动-文远知行杯 广东工业大学第十四届程序设计竞赛

A. hzy 和 zsl 的生存挑战

链接:https://nanti.jisuanke.com/t/38687

zsl 和 hzy 来到了臭臭城堡,打算挑战臭臭城堡的大魔王 hyz ,大魔王 hyz 准备让他们进行这样的一个挑战:

  1. 挑战开始,zsl 和 hzy 两个人各自来到一间密室,期间两人无法以任何形式交流,期间两人无法以任何形式交流
  2. 大魔王 hyz 会随机在两个人的脑海里各发送一个数字,0 或者是 1
  3. zsl 和 hzy 需要猜对对方听到的数字才算通关(当然是在各自的密室中回答的,也就是说回答的时候,zsl 听不到 hzy 的回答,同样,hzy 也听不到 zsl 的),但是大魔王 hyz 觉得人生不能过于无敌,因此降低难度,只要两个人中有一个人答对就算是通关

进行挑战之前,zsl 和 hzy 讨论并制定了一个详细的作战方案,使得自己通关的几率最高,并开始了这次挑战……

显然大魔王 hyz 给这两个人出的数字所有可能的情况有 00, 01, 10, 11 四种,请按上述枚举的顺序,计算所有情况下 zsl 和 hzy 通关的几率。

Input

(空)

Output

输出四个答案,每个答案后面跟随一个换行符并且保留两位小数位,分别对应 00, 01, 10, 11的情况下,zsl 和 hzy 通关的几率

样例输入

(空)

样例输出

1.00
0.00
0.50
0.55 (输出仅做格式参考,不保证正确性)

解法:一个人猜与自己听到数相同的,另一个人猜与自己听到数不同的,则百分之百有一个人可以猜对,因此四种情况都是1.00.。

代码:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
  printf("\n");
}
int main() {
  printf("1.00\n1.00\n1.00\n1.00\n"); 
  return 0;
}

B. 人类史上最大最好的希望事件

链接:https://nanti.jisuanke.com/t/38688

作为 CNCS 的半壁江山,狗哥常常在宇宙中心邵阳眺望黄浦江,夜晚的星空总是迷人,有时候还能见到彗星滑落。

狗哥是幸运的,他在两秒钟内看到了十七颗彗星划过天际,作为打 ACM 的学者,自然不会有「稳定-1」情况。他开始研究彗星运动的轨迹,发现他们都遵照斐波那契螺旋线在运动着。

尤里卡!狗哥觉得这就是找寻「生命,宇宙和一切的终极答案」的精要所在,但是怎么表示呢?狗哥觉得求取斐波那契螺旋线经过的一个个方格的面积之和就是公式的表现。

如下图,螺旋线每划过一个方格,都转过了四分之一圈。我们从第 0+\frac{0}{4}0+40​ 圈转到第 0+\frac{1}{4}0+41​ 圈,划过了最里面的两个方格,面积之和为 2(=1+1)2(=1+1) 。同理,从第 0+\frac{0}{4}0+40​ 圈到第 1+\frac{0}{4}1+40​ 圈划过了最里面的五个方格,他们的面积之和为 40(=1+1+4+9+25)40(=1+1+4+9+25) 。

但是聪明的狗哥需要一个程序去获得指定范围内的螺旋线面积之和,狗哥给了你一首「希望之花」的时间,而他需要利用这个时间去打出四暗刻单骑。如果你能完成这个程序,狗哥会封你为格拉摩根伯爵。

Input

不定组数据。

首先输入一个整数 Q,代表狗哥询问次数。

接下来 Q 行,每行四个整数 a , b , c , d,代表狗哥想求 a+\frac{b}{4}a+4b​ 到 c+\frac{d}{4}c+4d​ 之间的螺旋线面积之和。

1 \le Q \le 100001≤Q≤10000

0 \le a , c \le 100000≤a,c≤10000

0 \le b , d \le 30≤b,d≤3

结果对 192600817192600817 取模。

Output

一个数字,表示螺旋线面积之和。

样例输入复制

4
0 0 0 1
0 0 1 0
1 2 2 1
1 1 0 3
4
0 0 0 1
0 0 1 0
1 2 2 1
1 1 0 3

样例输出复制

2
40
4791
98
2
40
4791
98

代码:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
  printf("\n");
}
const int N = 4e4+5;
const ll Mod = 192600817;
ll a[N];
void db() {
  a[1] = a[0] = 1;
  for(int i =2; i < N; i++) {
    a[i] = (a[i-1] + a[i-2]) % Mod;
  }
  for(int i = 1; i < N; i++) {
    a[i] = (a[i-1] + a[i] * a[i]) % Mod;
  }
}
int main() {
  db();
  int n, b, c, d, e;
  while(~scanf("%d", &n)) {
    for (int i = 0; i < n; i++) {
      b = read(); c = read(); d = read();e = read();
      b = b * 4 +c;
      d = d * 4 +e;
      if(b < d) swap(b, d);
      if(d && b) printf("%lld\n", (a[b] - a[d-1] + Mod) % Mod);
      else if(b != 0 && d == 0) printf("%lld\n", a[b]);
      else printf("0\n"); 
    }
  }
}

 C. 超级无敌简单题

链接:https://nanti.jisuanke.com/t/38689

通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。

通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。

通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。

鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于 11。如果不能,则这个数字不是鸽子数。

例如 77 是鸽子数,因为 7 \to 49 \to 97 \to 130 \to 10 \to 17→49→97→130→10→1

(7 \times 7 = 497×7=49 ,4 \times 4 + 9 \times 9 = 97 , 9 \times 9 + 7 \times 7 = 130 \cdots4×4+9×9=97,9×9+7×7=130⋯如此类推)

显然 11 是第一个鸽子数。

有 QQ 个询问,每个询问给出一个数 kk ,你需要输出第 kk 个鸽子数。

Input

第一行一个 QQ ,代表询问的个数( Q \le 100000Q≤100000 )接下来 QQ 行,每行一个数字 kk( kk < 150000150000)

Output

每行输出一个数,代表第 kk 个鸽子数

样例输入复制

2
1
2

样例输出复制

1
7

代码:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
  printf("\n");
}
int next(int a) {
  int s = 0;
  while(a) {
    s += (a % 10) * (a % 10);
    a /= 10;
  }
  return s;
}
int a[1000];
vector<int>v; 
int main() {
  int p = 0 ;
  for(int i = 1; i < 729; i++) {
    int n1 = i, n2 = i;
    do {
      n1 = next(n1);
      n2 = next(n2);
      n2 = next(n2);
    } while(n1 != n2);
    if(n1 == n2 && n1 == 1) {
      a[i] = 1;
      p++;
      v.push_back(i); 
    }
  }
  for(int i = 729; i < 2000000; i++) {
    int s = i, sum = 0;
    while(s) {
      sum += (s % 10) * (s % 10);
      s /= 10;
    }
    if(a[sum]) {
      p++; 
      v.push_back(i);
    }
    if(p > 150000) break;
  }
  int t;
  t = read();
  while(t--) {
    int n;
    n = read();
    printf("%d\n", v[n-1]);
  }
  return 0;
}

G. 简单数学题

链接:https://nanti.jisuanke.com/t/38693

已知

\displaystyle F(n) = \sum_{i=1}^n (i \times \sum_{j=i}^n C_j^i)F(n)=i=1∑n​(i×j=i∑n​Cji​)

求 F(n) \bmod 1000000007F(n)mod1000000007

Input

多组输入,每组输入占一行,包含一个整数 n ( 1 \le n \le 10^{18} )n(1≤n≤1018)数据不超过 300000300000 组。

Output

对于每组输入,输出一行,包括一个数代表答案。

样例输入复制

5
100

样例输出复制

129
660756544

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
  printf("\n");
}
long long getpow(long long n, long long p, long long mod) {
  long long s = 1;
  p %= (mod-1);
  n = n % mod;
  while(p > 0) {
    if(p % 2 == 1) s = s * n % mod;
    p /= 2;
    n = n * n % mod; 
  }
  return s % mod;
}
const ll Mod = 1e9+7;
int main() {
  ll n;
  while(~scanf("%lld", &n)) {
    printf("%lld\n", (( ((n-1) % Mod * getpow(2,n,Mod))%Mod ) + 1) % Mod);
  }
  return 0;
}

 H. zyb 的面试

链接:https://nanti.jisuanke.com/t/38694

今天 zyb 参加一场面试,面试官听说 zyb 是 ACMer 之后立马抛出了一道算法题给 zyb :

有一个序列,是 11 到 nn 的一种排列,排列的顺序是字典序小的在前,那么第 kk 个数字是什么?

例如 n=15,k=7n=15,k=7, 排列顺序为1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 91,10,11,12,13,14,15,2,3,4,5,6,7,8,9 ; 那么第 77 个数字就是 1515.

那么,如果你处在 zyb 的场景下,你能解决这个问题吗?

Input

TT 组样例 ( T \le 100 )(T≤100)

两个整数 nn 和 kk ( 1 \le n \le 10^6 , 1 \le k \le n )(1≤n≤106,1≤k≤n) , nn 和 kk 代表的含义如上文

Output

输出 1 - n1−n 之中字典序第 kk 小的数字

样例输入复制

1
15 7

样例输出复制

15

代码:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;

public class Main {
    public static InputReader in = new InputReader(new BufferedInputStream(System.in));
    public static PrintWriter out = new PrintWriter(System.out);
    public static int[] s = new int[1000010];
    public static String[] ss = new String[1000010];

    public static void main(String[] args) {
        db();
        int t, n, k;
        t = in.nextInt();
        while(t-- > 0) {
            n = in.nextInt();
            k = in.nextInt();
            int i = 0, j = 0;
            while(i <= k) {
                if(s[j] <= n) {
                    i++;
                    if(i == k) {
                        i = s[j];
                        break;
                    }
                }
                j++;
            }
            out.println(i);
            out.flush();
        }
        out.close();
    }

    static void db() {
        int N = 1000005;
        for (int i = 0; i <= N; i++)
            ss[i] = i + "";
        Arrays.sort(ss, 0, N);
        for (int i = 1; i <= N; i++)
            s[i-1] = Integer.parseInt(ss[i]);
    }

    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }

    }
}

完整题解:https://blog.csdn.net/tianyizhicheng/article/details/88605227

只会五题,好想突破六题的槛啊啊啊啊啊啊啊啊啊

猜你喜欢

转载自blog.csdn.net/daixinliangwyx/article/details/90114467