科大讯飞笔试

t3 dp

前置知识:
(a * b)% c = (a % c * b % c) % c
(a + b) % c = (a % c + b % c) % c

状态表示:
fij ==> 前i个字符构成的数取余p为j的方案数

状态转移:
f[i][(j * 10 % p + x % p) % p] += f[i-1][j]; 即:f[i][(j * 10 % p + x % p) % p]是由前i-1个字符构成的数取余为j的方案转移而来,即(a * 10 + b) % p,其中a为前i- 1个字符构成的数字,b为当前数字

package xunfei;

import java.io.*;
import java.util.Scanner;

public class Solution3 {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static final int N = 110, M = 10010, MOD = (int) 1e9 + 7;
    static long[][] f = new long[N][M]; //fij前i和字符构成的数mod p 为j的方案数
    static int p;
    static String s;
    static char[] cs;

    static int nextInt() throws IOException {
        in.nextToken();
        return (int) in.nval;
    }

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        s = sc.nextLine();
        cs = s.toCharArray();
        int n = cs.length;
        p = nextInt();
        if (p == 0) out.println(0);
        else {
            if (cs[0] == '?') {
                for (int x = 0; x <= 9; x++) {
                    f[0][x % p]++;
                }
            } else {
                f[0][(cs[0] - '0') % p] = 1;
            }
            for (int i = 1; i < n; i++) {
                if (cs[i] == '?') {
                    for (int x = 0; x <= 9; x++) {
                        for (int j = 0; j < p; j++) {
                            //f[i][(int) ((f[i - 1][j] % p * x % p) % p)] += f[i - 1][j];
                            f[i][(j * 10 % p + x % p) % p] += f[i - 1][j];
                            f[i][(j * 10 % p + x % p) % p] %= MOD;
                        }
                    }
                } else {
                    int x = cs[i] - '0';
                    for (int j = 0; j < p; j++) {
                        //f[i][(int) ((f[i - 1][j] % p * x % p) % p)] += f[i - 1][j];
                        f[i][(j * 10 % p + x % p) % p] += f[i - 1][j];
                        f[i][(j * 10 % p + x % p) % p] %= MOD;
                    }
                }
            }
            out.println(f[n - 1][0]);
            out.close();
        }

    }
}




#科大讯飞##笔试#
全部评论
这个转移方程实在是太妙了,我一开始想的是三维dp,再加一个第i位赋值为x。但是怎么也想不出转移方程。说一下我对楼主算法的理解:对于f[i-1][j]其余数为j,代表的数字可以表示为k*p+j;当我们增加一位,并将该位的值赋值为x的时候,代表的数字为(k*p+j)*10+x;所以f[i-1][j]的下一位状态为f[i][(j*10+x)%p]。
3 回复 分享
发布于 2023-08-26 16:34 广东
太强了,第三题不会
2 回复 分享
发布于 2023-08-26 16:03 湖北
佬,看看realme手机秋招,全球Top5厂商,hc多多,岗位多多
1 回复 分享
发布于 2023-08-26 23:06 广东
确实有这个说法,但是写的时候能想到也确实强
1 回复 分享
发布于 2023-08-26 16:08 广东
竟然第三题用dp,状态转移方程完全没思路,大佬牛
1 回复 分享
发布于 2023-08-26 16:03 美国
递归卡时间效率只过了10%😔😔
1 回复 分享
发布于 2023-08-26 16:02 北京
为什么可以f[i][(j*10+x)%p]可以从f[i-1][j]转移过来呢?不是很理解,大佬可以解答一下吗
点赞 回复 分享
发布于 2023-08-27 15:41 浙江
还得是大佬
点赞 回复 分享
发布于 2023-08-26 16:23 辽宁
我把前两道编程题写完了之后发现还有三分钟交卷
点赞 回复 分享
发布于 2023-08-26 16:09 四川
大佬可以投递满帮保个底试试哈 https://www.nowcoder.com/feed/main/detail/a4df4a929a9148edb4a927e671a467e2?toCommentId=16770682
点赞 回复 分享
发布于 2023-08-26 16:07 江苏
第二题的题意没看懂,第二题那个我理解是只要用过相同字符集就+1,然后示例就G
点赞 回复 分享
发布于 2023-08-26 16:03 辽宁
点赞 回复 分享
发布于 2023-08-26 16:02 北京

相关推荐

其实本来打算等lastday的时候再写的,但是现在提笔写下这篇总结完全是出于自己的想法,今天上午自己被学校发的签到吵醒时才突然想明白了很多事情,遂决定写下本文进行总结,虽然现在顶多算2.5个月,但也大差不差喵。回看这段时间的日常实习,我的关键词是:遗憾,焦虑。当然也有快乐的时候,不过大部分时间都是前面这两种情绪主导。为了避免后人再次踩坑,我将在本文详细解释我遇到的困难&nbsp;+&nbsp;产生的原因&nbsp;+&nbsp;应对的措施。同时总结新人实习时除了业务本身,还有如何处理生活与工作上的平衡,调控自身的情绪,让自己恢复到最好的工作状态。本文不会教你实习怎么去做产出,因为有产出的前提是你的心态足够健康,且在工作之余还有时间去...
wuwuwuoow:你的经历跟挺像,但我实力远没你强,现在只能干外包。但解决焦虑这块我应该比你更有经验,因为我曾经也非常迷茫和焦虑: 1.规律作息。无论节假日,都必须在同一时间点睡觉,同一时间点起床。放假睡的多,工作睡的少,这就是典型的作息不规律。将直接干扰前额叶皮层功能,导致情绪波动(易怒、焦虑)。无论上班还是周末,我都是 11:30 睡,7 点起床。7.5h 睡眠,完全足够了。 2.运动。缓解压力,强身健体,提高免疫力。不要觉得每天没有时间锻炼,都是懒惰的借口。 3.冥想。长期练习会增厚前额叶皮层(理性决策区),缩小杏仁核体积(减少情绪过敏反应,核心),增强情绪调控能力。 方法很简单,任何时候都能做。就是闭上眼睛,只专注自己的呼吸,不去想其他任何事情。你可以尝试一下,你会发现非常难只专注呼吸,会有大量的想法涌现出来(什么走马灯),不要去压抑它们,而是放平心态,把注意力继续放在呼吸上面。 而且最重要的是,冥想让你学会“活在当下”。因为处于冥想的你,除了专注呼吸你还能做什么呢?你什么都做不了。生活也是这样,我们无法改变过去,无法预知未来会发生什么,我们能做的只有手头的事情,除此之外什么都别想,因为你无法去改变它们。 4.工作与生活分离。工作不是生活的全部,生活可不是只有工作。像我放假的时候,从不带电脑回去。放假该玩就玩吧。 上面要是都能做到,其实完全解决不了你工作上的问题,完不成的需求还是完不成,面试该挂还是得挂。不过呢,当你再次迷茫,再次焦虑的时候,你会发现,诶,还好,没这么难受。比如面试挂了,可能以前的你会感觉非常难受。但如果你做到以上 4 点,你还是会难受的,但其实又没这么难受,可能你会这样想:既然挂了我还能怎么样?这公司不要我,有的是公司要我!
投递腾讯等公司10个岗位 >
点赞 评论 收藏
分享
牛客963010790号:一般是hr拿着老板账号在招人不是真是老板招
点赞 评论 收藏
分享
烤点老白薯:这种东西到时候公众号搜索都有的
点赞 评论 收藏
分享
评论
5
23
分享

创作者周榜

更多
牛客网
牛客企业服务