首页 > 其他分享 >范围中美丽整数的数目

范围中美丽整数的数目

时间:2023-08-20 19:57:40浏览次数:38  
标签:even cur int 数目 memo 整数 num 美丽 odd

给你正整数 low ,high 和 k 。
如果一个数满足以下两个条件,那么它是 美丽的 :

  • 偶数数位的数目与奇数数位的数目相同。
  • 这个整数可以被 k 整除。

请你返回范围 [low, high] 中美丽整数的数目。

1. 数位dp

class Solution {
public:
    int calc(int num,int k) {
        string s = to_string(num);
        int m = s.length(), memo[m][k+1][m][m];
        memset(memo, -1, sizeof(memo)); // -1 表示没有计算过
        function<int(int,int,int,int,bool,bool)> f = [&](int i, int odd, int even, int cur, bool is_limit, bool is_num) -> int {
            if (i == m )
                return is_num&even==odd&cur==0; // is_num 为 true 表示得到了一个合法数字
            if (!is_limit && is_num && memo[i][cur][odd][even] != -1)
                return memo[i][cur][odd][even];
            int res = 0;
            if (!is_num) // 可以跳过当前数位,表示前面全为0
                res = f(i + 1, odd, even, cur ,false, false);
            int up = is_limit ? s[i] - '0' : 9; 
            for (int d = 1 - is_num; d <= up; ++d) // 枚举要填入的数字 d
                res = res + f(i + 1, odd+(d%2==1), even+(d%2==0),(cur*10+d)%k, is_limit && d == up, true);
            if (!is_limit && is_num)
                memo[i][cur][odd][even] = res;
            return res;
        };
        return f(0, 0, 0,0, true, false); //从第0位开始,前面有0个奇数,当前累计值为0, 受限,不合法
        cout<<endl;
    }
    int numberOfBeautifulIntegers(int low, int high, int k) {
        return calc(high,k)-calc(low-1,k);
    }
};

标签:even,cur,int,数目,memo,整数,num,美丽,odd
From: https://www.cnblogs.com/929code/p/17644460.html

相关文章

  • vscode 工作区文件数目太多时,代码无法提示补全
    VScode工作区过大时Python插件失效,无法跳转-CSDN根据这篇文章的说法,是由于语言服务器要搜索源文件,文件数目太多时会消耗时间过多,此时表现为ctrl点击模块名/函数名无法跳转(都是白色的,不是彩色的)。打开vscode--输出--Python语言服务器可以看到详细的日志解决方法......
  • leetcode2235 两整数相加
    题目描述:(这第一种方法我就不多说了,肯定是有手就行)给你两个整数num1和num2,返回这两个整数的和。示例1:输入:num1=12,num2=5输出:17解释:num1是12,num2是5,它们的和是12+5=17,因此返回17。示例2:输入:num1=-10,num2=4输出:-6解释:num1+num2=-6,因此返......
  • Python练习:输入一个整数,输出该数二进制表示中1的个数。
      Python3整数对象存储为无符号数加上符号位标志,所以不存在“负数”补码形式,因此,计算“1”的数量需要按去符号后的无符号数:cnt=bin(n).count('1')另外,Python3无长整,整数长度原则上不限,所以不能以假定的32位处理。    补码+原码=2**321#-*-coding:ut......
  • 剑指 Offer 16. 数值的整数次方(中等)
    题目classSolution{public:doubletraversal(doublex,intn){if(n==0)return1.00000;doubley=traversal(x,n/2);//本题需要对递归时的指数进行二分法,否则超时。returnn%2==0?y*y:y*y*x;//y=(x^4)。n=8,则x^8=y*y;n......
  • 【题解】#119. 最大整数 题解(2023-07-12更新)
    #119.最大整数题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)本文已同步至学校网站、博客园。Part2背景本来是不想写这篇题解的,但是由于卡了这个蒟蒻\(1\)整天,故此纪念。Par......
  • 《剑指Offer》-16-数值的整数次方
    将n次相乘的幂运算转化为log2N次平方运算,并且采用递归算法原书给出的最优算法本身不处理负数,是外层函数处理的 doublemyPow(doublex,intn){ doubleres=pow(x,abs(n)); if(n<0)res=1/res; returnres; } doublepow(doublex,intn){ if(n==......
  • 整数划分问题(完全背包)(总方案数和最小方案数)
    完全背包解决整数划分问题:总方案数:完全背包:在前i个数中选,且总和恰好等于j的方案数f[i][j]=f[i-1][j]+f[i-1][j-v]化成一维:f[j]+=f[j-v];这种求总方案数的情况需要把f初始化为0,然后f[0]初始化为1,最后累加f[j]900.整数划分这里从小到大枚举i,用到的v就是枚举......
  • 将整数转换为两个无零整数的和
    「无零整数」是十进制表示中不含任何0的正整数。给你一个整数n,请你返回一个由两个整数组成的列表[A,B],满足:A和B都是无零整数A+B=n题目数据保证至少有一个有效的解决方案。如果存在多个有效解决方案,你可以返回其中任意一个。示例1:输入:n=2输出:[1,1]解释:A......
  • 内存受限下找出亿级整数集合中的不重复元素
    在大数据环境下,我们常常需要处理数量极其庞大的数据集,但由于内存大小的限制,无法直接加载到内存中进行操作。这时就需要设计适合内存受限环境的算法,来解决问题。本文将以在内存不足的情况下,找出亿级规模整数集合中的不重复元素为例,探讨一种基于BloomFilter的数据结构的解决方......
  • python实战练习1:矩阵和整数相乘
       1#方法一:这是最先想到的2s=[[1,2,3],[4,5,6],[7,8,9]]3n=int(input())45r=[]6foriins:7a=[]#这个很重要,每次要清空8forjini:9a.append(j*n)10r.append(a)1112print(r)13141516171......