UVA - 10624 Super Number

题目大意: 给定两个数 n 和 m ,如果长度为 m 的数满足对于每个 i (n <= i <= m),数字的前 i 位都能被 i 整除,那么这个数就是超级数,求出字典序最小的符合要求的超级数。

解题思路:直接暴力就行,如果每次进行整除判断的时候,对当前数每位都进行取余运算,那么将会超时,因此每 18 位进行一次取余(long long的数据范围为:-9223372036854775808..9223372036854775807,这样在 1S 左右就可以AC了。

#include <cstdio>

int n, m, A[35];

bool judge(int cnt) {
    long long tmp = 0;
    for (int i = 0; i < cnt; ++i) {
        tmp = tmp * 10 + A[i];
        if (i == 18)
            tmp %= cnt;
    }

    return tmp % cnt;
}

bool DFS(int cur) {
    if (cur == m)
        return true;

    for (int i = cur ? 0 : 1; i < 10; ++i) {
        A[cur] = i;
        if ((cur < n - 1 || !judge(cur + 1)) && DFS(cur + 1))
            return true;
    }

    return false;
}

int main() {
    int T, cnt = 0;
    scanf("%d", &T);
    while (T--) {
        printf("Case %d: ", ++cnt);
        scanf("%d%d", &n, &m);
        if (DFS(0)) {
            for (int i = 0; i < m; ++i)
                printf("%d", A[i]);
            puts("");
        }
        else
            puts("-1");
    }
    return 0;
}
时间: 2024-11-07 12:46:41

UVA - 10624 Super Number的相关文章

10624 - Super Number

题目链接 题意:给出n到m的范围,求出一个数在前i位数组成的数字能被i整除,如果存在输出这个数,如果不存在,输出-1. 思路:回溯,每次放第i位,然后判断是否符合题意.这题踩着时间过去的2.6s(看了下别人的题解,可以减少取模次数来节省时间). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

UVA 10909 - Lucky Number(树状数组)

UVA 10909 - Lucky Number 题目链接 题意:问一个数字能否由两个lucky num构造出来,lucky num根据题目中的定义 思路:利用树状数组找前k大的方法可以构造出lucky num的序列,然后每次查找n,就从n / 2开始往下查找即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 2000001

uva 11651 - Krypton Number System(矩阵快速幂)

题目链接:uva 11651 - Krypton Number System 题目大意:给定进制base,和分数score,求在base进制下,有多少个数的值为score,要求不能有连续相同的数字以及前导0.计算一个数的值即为相邻两位数的平方差和. 解题思路:因为score很大,所以直接dp肯定超时,但是即使对于base=6的情况,每次新添一个数score最大增加25(0-5),所以用dp[i][j]预处理出base平方以内的总数,然后用矩阵快速幂计算. #include <cstdio> #

UVA10624 - Super Number(dfs)

题目:UVA10624 - Super Number(dfs) 题目大意:给你n和m要求找出这样的m位数,从第n位到第m位都满足前i位是可以被i整除,如果没有这样的数,输出-1.有多个就输出字典序最小的那个. 解题思路:将每个位置都用0..9枚举一下,注意第一个字符不能是0,然后dfs判断每个位置是否都满足要求.注意这里是会爆long long的,所以要取模一下.本来以为这样的做法会超时的,结果竟然过了,估计是样例数少,而且找不到的情况也比较少. 代码: #include <cstdio> #

UVA 11651 - Krypton Number System(DP+矩阵快速幂)

UVA 11651 - Krypton Number System 题目链接 题意:给一个进制base,一个分数score求该进制下,有多少数满足一下条件: 1.没有连续数字 2.没有前导零 3.分数为score,分数的计算方式为相邻数字的平方差的和 思路:先从dp入手,dp[i][j]表示组成i,最后一个数字为j的种数,然后进行状态转移,推出前面一步能构成的状态,也就是到dp[(b - 1) * (b - 1)][x]. 然后可以发现后面的状态,都可以由前面这些状态统一转移出来,这样就可以利用

UVA - 10591 Happy Number

Happy Number UVA - 10591 Let the sum of the square of the digits of a positive integer S0 be represented by S1. In a similar way, let the sum of the squares of the digits of S1 be represented by S2 and so on. If Si = 1 for some i ≥ 1, then the origin

UVa 11946 - Code Number

题目:两个小朋友写信让父母传递,为了不让父母看信里的内容,对信里面的内容加密, 请对加密后的信解密. 分析:字符串,数论.只有10个字母被选择称为0~9的映射,直接转化即可. 说明:╮(╯▽╰)╭UVa又打不开了╮(╯▽╰)╭. #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> char buf[81]; char map[11] = "OIZEASGT

UVa 11734 - Big Number of Teams will Solve This

题目:一个ACM的判题的小程序,两组字符全相同,为正确,比标准多输出空格,为格式错误,其他为错误. 分析:字符串.从前向后扫描,如果两字符不同,若A串当前字符不是空格,则错误: 若是空格,则一定不会是正确,滤过空格,看剩余部分,如果剩下字符相同则格式错误: 否则,一定错误: 说明:注意结束位置的空格.想起几年前开发自己OJ的日子了. #include <iostream> #include <cstdlib> #include <string> #include <

UVA - 11882 Biggest Number(dfs+bfs+强剪枝)

题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次. 题目分析:DFS.剪枝方案:在当前的处境下,找出所有还能到达的点的个数,若当前数字的长度加上个数仍小于目前最优答案的长度,则剪去:若长度相等,则将所有还能到达的数字按从大到小排序后连到当前数字上,如果还比目前最优解小,则减去.找出所有还能到达的点的过程用BFS实现. 1 #pragma comment(linker, "/STACK:1024000000,10