• XDTIC2019招新笔试题 + 官方解答


    腾讯创新俱乐部2019年招新笔试试题

     
    [1] 小宗学长正在努力学习数论,他写下了一个奇怪的算式:

    [2019^{2018^{2017^{dots^{2^1}}}} ]

    算式的结果一定很大,所以他只让你求出这个数的后三位,聪明的你能帮帮小宗学长吗?

    提示: ((20)19^5) 结果后三位为 (099)

    [2] 腾讯的吉祥物想给自己造一套海景别墅,可他自己太懒了,于是抓了一批壮丁来造房子,他要求那些壮丁必须七天造好房子,否则就封他们 (QQ) 号,不过可爱的吉祥物很讲道理,他决定拿金条当报酬。吉祥物寻思着每天给工人们发 (frac17) 的金条这个想法不错,可我们得原谅吉祥物实在是太懒了,只想给金条切两刀,请问吉祥物该怎么切金条才好呢?

    [3] (dyx)学长带着2颗鸡蛋爬上了一栋100层的大楼,现在已知一个鸡蛋从第 (k) 层及以上的楼层落下来会摔破,在第 (k) 层以下的楼层落下则不会摔破。他想知道在最坏情况下,最少扔多少次鸡蛋才能确定 (k) 的大小。

    [4] 一群吉祥物表演杂技走钢丝,钢丝长50米,从东向西看,吉祥物们分别分布在钢丝的(4)米、(17)米、(19)米、(28)米、(44)米处。表演开始时,吉祥物们同时以 (1m/s) 的速度向左或向右走,两只吉祥物相遇时,则同时掉头往反方向走,走到钢丝尽头则被热气球接走。考虑所有情况,最晚被接走的吉祥物在钢丝上停留的最长时间可能是多少?对于一般情况,给定 (n) 只吉祥物的初始位置坐标 (x_1, x_2, x_3, dots, x_n) ,吉祥物被接走的最早和最晚时刻分别在什么时候?

    [5] 某高校举办三行情书大赛,数学系一男生浪漫的写道:

    高斯拿走了我的尺规 / 我只好 / 徒手为你画眉

    现在假设你高冷的数学女神给你一个圆规,并在纸上画了两个点 (A)(B) ,你能想办法只用圆规作出线段 (AB) 的中点 (C) ,博她开心一笑吗?

    提示:先作出点 (D) ,满足 (vec{AD} = 2vec{AB})

    [6] 俱乐部主席箱箱学长最近很想玩游戏,于是他决定和你一起玩,游戏是这样的:他带来了一堆糖果,两个人轮流从其中拿走一定数量的糖果,拿走最后所有糖果的人为赢家,不过得遵循如下规则:

    • 第一次取不能取完,至少取(1)
    • 从第二次开始,每个人取的糖果数至少为(1),至多为对手刚取的糖果数的两倍

    现在让你开始先拿糖果,如果你赢了就能获得全部糖果,输了的话箱箱会收回他的全部糖果。

    如果桌上摆着 (13) 颗糖果,你会来尝试挑战吗?如果糖果数量为任意正整数 (n),你能想出赢得全部糖果的必胜方案吗?

    [7] 好奇的周队发现了一个神奇的(22)位数,它的个位数是(7)。当她用(7)去乘这个(22)位数时,发现它的积仍然是个(22)位数,只是个位数的(7)移到了第一位,其余(21)个数字的排列顺序还是原来的样子。请问这个神奇的(22)位数是多少?

    提示:这道题如果用字母来代表数字,列成算式是:

    (ABCDEFGHIJKLMNOPQRSTU7×7=7ABCDEFGHIJKLMNOPQRSTU)

    [8] TIC里有位大佬,每次在群里出现时所有人都会惊呼:“zk大佬来水群了!!!”,但是wzk是一个非常低调的大佬,他不希望群里一堆菜鸡吹捧自己。于是他以大佬的身份宣布凡是在群里讨论wzk的人(每次提到wzk必是一句完整的“wzk!wzk!wzkNB!”)都会被他用小本本记住。那么问题来了,wzk又是怎么快速察觉到有人讨论他呢?(此题假设TIC群里所有的话都是由字母和符号构成)

    请写出用计算机快速判断是否讨论了wzk的方法。

    例如:判断wzkwzk!!wzawzk!wzk!NBwzk!!wzk!wzk!wzk!wzkNB两句话中是否谈及wzk(计算机判断字母或者符号是否相同只能一个一个对比)


    腾讯创新俱乐部2019年招新笔试答案

    问题1

    [099^{10} = (100-1)^{10} equiv 1 ext{ mod } 1000\ 2019^{50} equiv 1 ext{ mod } 1000 ]

    ​ 现在问题转化为求 (2018^{2017^{dots^{2^1}}}) 对 50 取余的结果

    笔算过程:

    19的幂的后三位数周期是50,2018的幂模50周期是4。
    2017模4等于1,从1到2016那些数都没用。
    19的18次方模1000等于841,这就是答案。

    代码实现:

    欧拉定理降幂公式 当(B ge varphi (C)) 时, (A^B \% C = A^{(B\% varphi(C)) + varphi(C)} \% C)

    递归计算得到结果

    typedef long long ll;
    const int maxn = 3000;
    int pri[maxn], tot;
    bool vis[maxn];
    int phi[maxn];
    
    // 欧拉线性筛
    void getPhi(int n) {
    	vis[1] = 1;
        phi[1] = 1;
        for(int i=2;i<=n;i++) {
            if(!vis[i]) {
                pri[++tot] = i;
                phi[i] = i-1;
            }
            for(int j=1;j<=tot && i*pri[j]<=n;j++) {
                vis[i*pri[j]] = 1;
                if(i%pri[j]==0) {
                    phi[i*pri[j]] = pri[j] * phi[i];
                    break;
                } else {
                    phi[i*pri[j]] = phi[pri[j]] * phi[i];
                }
            }
        }
    }
    
    // 快速幂求 a^n % p
    ll powmod(ll a, ll n, ll p) {
        ll res = 1;
        while(n) {
            if(n&1) res = res * a % p;
            a = a * a % p;
            n >>= 1;
        }
        return res;
    }
    
    ll f(ll a, ll p) {
        if(p==1) return 0;
        if(a==1) return 1;
    
        ll exp = f(a-1, phi[p]) + phi[p];
        return powmod(a, exp, p);
    }
    // getPhi(2019)
    // f(2019, 1000) ==> 841
    

    问题2

    ​ 分为 (1over7)(2over7)(4over7) 三部分。

    问题3

    方法一:

    找规律

    (f[n]) 表示 (n) 层楼,最少扔鸡蛋次数。

    (f[1] = 1)

    (f[2] = 2, f[3] = 2)

    $ f[4] = 3, f[5] = 3, f[6] = 3$

    $ f[7] = 4,f[8] = 4 ,f[9] = 4 ,f[10] = 4$

    (dots)

    于是 (f[100] = 14)

    方法二:

    (f[n][k]) 表示 (n) 层楼,(k) 个鸡蛋情况下找到答案的最少扔鸡蛋次数。

    显然,只有一个鸡蛋时,必须从低层往高层逐层试验,有

    [f[n][1] = n ]

    有两个鸡蛋时,第一次先从某一层 (i) 扔下,如果碎了,就只剩一个鸡蛋,此时答案为 (1 + f[i-1][1])

    没有碎的话,问题相当于求解 (f[n-i][2]) 。最坏情况下,我们要取两者的最大值为试验次数。

    最优解为 (i) 取 1~100 所有尝试的最小值。

    所以

    [f[n][2] = min(f[n][2], 1+max(f[i-1][1], f[n-i][2])) ]

    [f[n][2] = min(f[n][2], 1+max(i-1, f[n-i][2])) ]

    (f[0][2] = 0)(f[1][2] = 1) , (f[2][2] = 1) ,… ,递推得到(f[100][2])

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int inf = 1000000;
    int dp[110][5];
    
    int f(int n, int k) {
    	if(n==0) return 0; 
    	if(k==1) return n;
    	if(n==1) return 1;
    	if(dp[n][k]!=-1) return dp[n][k];
    	
    	int ans = inf;
    	for(int i=1;i<=n;i++) {
    		ans = min(ans, 1 + max(f(i-1, k-1), f(n-i, k)));
    	}
    	return dp[n][k] = ans;
    }
    
    int main() {
       	memset(dp, -1, sizeof(dp));
       	cout<<f(100, 2)<<endl;
        return 0;
    }
    

    问题4

    ​ 两只吉祥物相遇时同时掉头可视为它们穿过对方继续前进,故离另一端最远的吉祥物在钢丝上停留的时间最长。即,例如当位于4米处的吉祥物一开始向西走,其它吉祥物一开始向东走时,在钢丝上停留最久的吉祥物时间可能是(50-4)/ 1 = 46s。

    ​ 找出最小的 (x_i) 和最大的 (x_j) ,ans1 = min( (x_i) , 50 - (x_j) ),ans2 = max( 50 - (x_i) , (x_j) )

    问题5

    ​ 以 D 为圆心 ,AD 为半径画圆,与圆 A 交 E, F ;

    ​ 以 E 为圆心, EA 为半径画圆, 以F为圆心,FA 为半径画圆,交点 C 即为所求。

    证明:

    ( riangle ACE) 相似于$ riangle AED$ (Rightarrow) (AC cdot AD = AEcdot AE) (Rightarrow) (AC = {1over 2} AB = {1over 2} AE)

    1567083514035

    问题6

    ​ 斐波那契博弈,当糖果数量为斐波那契数时,先手必败。

    [egin{align} & Fib[0] = 0, Fib[1] = 1\ & Fib[n] = Fib[n-1] + Fib[n-2], n>=2 end{align} ]

    ​ 证明略。

    问题7

    ​ 由低位往高位计算。

    ​ 答案:1014492753623188405797 * 7 = 7101449275362318840579

    ans = '7'	# 结果
    add = 0		# 进位
    now = 7		# 当前位
    
    for i in range(1, 22) :
    	now = now*7 + add
    	add = now // 10
    	now = now % 10
    	ans = str(now) + ans
    
    res = ('7'+ans)[0:22]
    if int(ans)*7 == int(res) :
    	print('%s * 7 = %s' % (ans, res))
    

    面试得到的新方法:

    [(10*x + 7)*7 = 7*10^{21}+x ]

    解得

    [x = frac{7*10^{21}-49}{69} = 101449275362318840579 ]

    所以

    [ans = 10*x + 7 = 1014492753623188405797 ]

    问题8

    ​ 字符串匹配,KMP算法 / 字符串哈希


    (END)

  • 相关阅读:
    对象的数组去重
    js中map()、some()、every()、filter()的区别
    vue-cli3.0 vue脚手架3.0的使用
    统计各元素出现的次数(字符串,数组)
    string转换为其它数据类型 atoi _atoi_l, _wtoi, _wtoi_l
    static_cast void*
    printf()
    strlen _tcslen
    CSting 类型转换
    模板
  • 原文地址:https://www.cnblogs.com/izcat/p/11509584.html
Copyright © 2020-2023  润新知