数论 - 组合数学 --- 1的个数

1的个数



Mean:

输入一个n,计算小于10^n的正整数中含有1的数的个数。

analyse:

这题是一道组合数学课后思考题。

基本思路:  组合数学乘法原则 + 容斥原理

n位数中,每位可选:{0,1,2,3,4,5,6,7,8,9},所以共有10^n种,其中要除掉每位都为0的情况,所以要减一。

其中每位上不选1的情况为:{0,2,3,4,5,6,7,8,9},所以共有9^n中,同样要除掉全部为0的情况。

Time complexity:O(n)

Source code:

//Memory   Time
// 1347K   0MS
// by : Snarl_jsb
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<climits>
#include<cmath>
#define N 1000010
#define LL long long
using namespace std;
//输入一个n,求小于10^n的正整数中有多少个1;

int main()
{
//    freopen("C:\\Users\\ASUS\\Desktop\\cin.txt","r",stdin);
//    freopen("C:\\Users\\ASUS\\Desktop\\cout.txt","w",stdout);
    int n;
    while(cin>>n)
    {
//        if(n==1)
//            puts("1");
        int sol=1;
        for(int i=1;i<=n;i++)
        {
            sol*=10;
        }
        sol--;
        int res=1;
        for(int i=1;i<=n;i++)
        {
            res*=9;
        }
        res--;
        cout<<sol-res<<endl;
    }
    return 0;
}

  

时间: 2024-12-27 23:05:21

数论 - 组合数学 --- 1的个数的相关文章

Codeforces 223APartial Sums 数论+组合数学

题意很简单,求不是那么好求的,k很大 要操作很多次,所以不可能直接来的,印象中解决操作比较多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就只能多画画什么 的了 就以第一个案例为主吧 , 3 1 2 3 k我们依据画的次数来自己定好了 下面的每个数表示这个位置的 数由最初的 数组num[]中多少个数加起来得到的 当k为0的时候呢,就是 1 1 1 k为1的时候呢 1 2 3 k为2的时候呢 1 3 6 那么k为3的时候 1 4 10 这里看一下 从数组下标0开始,那么其实就是 C(i +

CodeForces 396A 数论 组合数学

题目:http://codeforces.com/contest/396/problem/A 好久没做数论的东西了,一个获取素数的预处理跟素因子分解写错了,哭瞎了,呵呵, 首先ai最大值为10^9,n为500,最坏的情况 m最大值为500个10^9相乘,肯定不能获取m了,首选每一个ai肯定是m的一个因子,然后能分解就把ai给分解素因子,这样全部的ai都分解了  就能得到m的 所有素因子 以及 所有素因子的个数,题目求的 是n个因子的 不同序列的个数,所以每次 只能选出n个因子,这n个因子由素因子

组合数学 - 组合数的个数

组合数的个数 输入一个n,然后输入n个一位数,求这n个数组成的不重复出现的整数的总和. Mean: 略 analyse: 这样的数可以是1~n位,总共数的数目为:P(n,1)+p(n,2)+p(n,3)+.....+p(n,n)个.(其中p(n,m)表示从n个数中选m个数组成的排列的数目). 若将这些数全部罗列出来再来求和,这不是一个好办法.其实我们可以将个位的和a1求出来,然后十位的和a2求出来,然后百位,然后千位......直到第n-1位. 那么最后的和就是: sum=a1*1+a2*10^

数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!

Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a tagline "Save the cheerleader, Save the world!". Here Heroes continues, "Solve the puzzle, Save the world!".Finally, alien invaders visit

Uva 11076 Add Again (数论+组合数学)

题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时的排列有多少种为kind1, 同理,假设数字k2在第一位然后求出剩下N-1位的排列数num2,我们就可以知道k2在第一位时的排列有多少种为kind2, k1*num1+k1*num2.....+kn*numn 就是我们要求的这些数对第一位的所有贡献,我们知道第一位的贡献=对第二位的贡献=第三位的贡献..... 把所有贡献加和,就能求出结果 知识:

数论专项测试——约数个数和(lucas的数论)

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 typedef long long int64; 8 const int mod=1000000007; 9 #define maxn 2000005 10 int top,tot,d[ma

[codevs1262] 不要把球传我 数论+组合数学

没什么好说的,很容易分析出递推公式f[n]=(n-2)*(n-1)*(n-3) div 6; 代码 begin randomize; writeln(random(4000)+1000); end. 巨短,就是这样233() 我不会告诉你这一张是水的= = 喜欢就收藏一下,vic私人qq:1064864324,加我一起讨论问题,一起进步^-^

雅礼集训——day3、day4

day3: 上午考试就拿了10分... T1写了个N^3的暴力,然后就拿了10分...正解是要二分时间然后找到前m个脚,然后用二分套二分求第k大.... T2看了半天感觉并不可做...然后正解居然要用斐波拉契数列的通项来求解.... T3求最小生成树的个数,我以为这道题还是可以拿50分的,然后就没有然后了.推了2小时的样例然后强行把自己劝退了...正解是要用字母树+贪心... 要学的东西又多了好多,压力好大... 下午讲的字符串算法,最后的那个回文树不是很明白...这两天得学一下字符串算法 da

day5感想

---恢复内容开始--- 我感觉自己真的是太弱了,和那些从初中开始学的人TT 今天讲的数学,毕竟以前尖子生培训打过点基础,感觉还不错,但也仅限于听懂而已,打代码什么的…… 今天的内容: 一.数论 1. 判断一个数是否是质数  因为一个合数n必然包含一个不超过sqrt(n)的 质因子  所以筛一遍从2到sqrt(n)即可 求1~n间所有质数? 埃拉托色尼筛选法  每次取出素数的倍数,最后判断?记住POJ2689这道题,怎么也要做出来 2.约数 质因数分解 gcd(a,b)=gcd(a,a-b) B