zoukankan      html  css  js  c++  java
  • 51Nod 1009 数字1的数量(思维)

    题目链接

    题目大意

      略

    解题思路

      可以逐位考虑当前数位上数字为1时的数字数量然后累加起来,因为每次只考虑当前数位的贡献,所以在计算过程中不存在重复的问题。
      举个例子,比如1361092,我们用x代替0~9十个数字。
      1.对于当前位的数字,如果大于1,比如说9的情况,那么十位为1的数字,也就是1x - 136101x就有((13610+1) imes 10))个,其中13610是比十位更高的数字,加上的1是当前十位上的1,为什么还乘十呢?因为后面有1个x,代表后面可以有10种数字。
      2.如果等于0呢?和第一种情况类似,不过需要向前借1,比如到了百位,就是1xx-13601xx,贡献就是((1361-1+1) imes 100))
      3.如果是1呢?这时候我们发现,加入1后面如果不全是9,是取不到上面那么多数的,比如1xxx-1361092,后者取到1092就结束了,不可能到9999,那么还采用第2种方法,向前借1,1xxx-1351xxx肯定是都能取到了,剩下的就是1361000-1361092了,这里取模就行了,所以贡献就是((136-1+1) imes 1000 + 1361092%1000))

    代码

    int main() {
        ll n; cin >> n;
        ll mul = 1, m = n, ans = 0;
        while(n) {
            ll res = n%10;
            if (res>1) ans += (n/10+1)*mul;
            else if (!res) ans += n/10*mul; 
            else ans += n/10*mul+m%mul+1;
            mul *= 10; n /= 10;
        }
        cout << ans << endl;
        return 0;   
    }
    
  • 相关阅读:
    函数式宏定义与普通函数
    linux之sort用法
    HDU 4390 Number Sequence 容斥原理
    HDU 4407 Sum 容斥原理
    HDU 4059 The Boss on Mars 容斥原理
    UVA12653 Buses
    UVA 12651 Triangles
    UVA 10892
    HDU 4292 Food
    HDU 4288 Coder
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13588604.html
Copyright © 2011-2022 走看看