从0,1,2...n中统计0,1,2...9各出现了多少次【SWUN1597】
题目就是说给你一个N。计算一下从0,1,2,3,4,5,,,,,,n-1,n中计算出0,1,2,3,,,,7,8,9分别出现了多少次...
#include<cstdio>
#include<cstring> typedef unsigned __int64 LL; LL dp[11][25][12];
/*
*dp[k][i][j]表示记录目标数字k,第i位取j时,从0位到i位一共有多少个
*/
int bit[25];
LL tenk[22];//10^k
LL n; inline void Init()
{
memset(dp,-1,sizeof dp);
int i;
tenk[0]=1;
for(i=1;i<22;++i)
tenk[i]=tenk[i-1]*10;
} inline int work(LL val)
{
int len=0;
for(;val;val/=10)
bit[++len]=val%10;
return len;
/*
*把val从高位到低位存
*e.g.:val=132,bit=2 3 1
*/
} inline LL dfs(int p,int s,int tar,int u,int e)
{
/*
*直接套用的数位dp模板...
*p: 从高位到低位位置p
*s: 从第一位非0数字开始s=1
*tar: 目标数字
*u: 上一步取u
*e: 边界
*/
if(p<1)
return s&&u==tar;
if(~dp[tar][p][u] && !e && s) return dp[tar][p][u];
/*
*记忆化如果目标数字tar p+1位取u,记忆过。而且s为1
*/
int mx=e?bit[p]:9,i;
LL ret=0;
for(i=0;i<=mx;++i)
{
int news=(s||i>0);
if(i==tar && news)
{
/*
*如果当前位取i而且是目标数字,而且s=1,要两种情况
*如果是边界,而且不是最后一位:加剩下的
*如果不是边界,而且不是最后一位: ret+=10^p-1个数
*->4567 如果目标数字是4而且不是最后一位,当到第4位(从右到左,第4位取4),是边界所以ret要加4567%10^(4-1)==567
*->4567 如果目标数字是4而且不是最后一位,当到第3位(从右到左,第3位取4),不是是边界所以ret要加10^(3-1)==100
*/
if(e&&i==mx)
{
if(p!=1)
ret+=(n%tenk[p-1])+1;
}else if(p!=1)
{
ret+=tenk[p-1];
}
}
ret+=dfs(p-1,news,tar,i,e&&i==mx);
}
if(!e && s) dp[tar][p][u]=ret;
return ret;
} int main()
{
int i;
Init();
while(~scanf("%I64u",&n))
{
int len=work(n);
int ok=0;
for(i=0;i<10;++i)
{
if(ok) putchar(32);
ok=1;
LL ret=dfs(len,0,i,0,1);
if(i==0) ret++;
printf("%I64u",ret);
}
putchar(10);
}
return 0;
}
/*
18446744073699999999 */
从0,1,2...n中统计0,1,2...9各出现了多少次【SWUN1597】的更多相关文章
- String.format("%0"+length+"d", arr)中的%0和"d"分别代表什么
public static void main(String[] args) { int a = 8; String s = String.format("%04d", a); S ...
- MySQL 8.0 中统计信息直方图的尝试
直方图是表上某个字段在按照一定百分比和规律采样后的数据分布的一种描述,最重要的作用之一就是根据查询条件,预估符合条件的数据量,为sql执行计划的生成提供重要的依据在MySQL 8.0之前的版本中,My ...
- excel中统计COUNTIFS的值为0
excel中统计COUNTIFS的值为0 个人认为是由于导出的文件里面的字符个数问题 使用 =COUNTIFS(H1:H175,"微信支付") 这个的结果居然是0,找了很多办法 于 ...
- 求N的阶乘N!中末尾0的个数
求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...
- spark机器学习从0到1基本的统计工具之(三)
给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计.一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值.中位数.众数和四分位均值),展型 ...
- vs2013中2.0类库提示是英文,解决方案
将C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\zh-Hans下的XML文件复 ...
- 错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条
在access的mdb数据库动态更新的过程中,遇到了DeleteCommand出现DBConcurrencyException异常,错误:违反并发性: DeleteCommand 影响了预期 1 条记 ...
- Bash 中的 $0 在什么时候不是 argv[0]
每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的. 很多人说 ...
- vc6.0运用mysql数据库中的编码所导致的乱码问题(接收和输出的编码必须要一致)
[编译中遇见的问题] ①在用vc 6.0去调用MySQL中的数据时,出现中文乱码 ②不明白mysql中的码制 [开始解决问题] ①打开mysql控制台 ...
随机推荐
- Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工 ...
- unique() 去重函数
unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...
- bzoj2431: [HAOI2009]逆序对数列
dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...
- UVa 11754 (中国剩余定理 枚举) Code Feat
如果直接枚举的话,枚举量为k1 * k2 *...* kc 根据枚举量的不同,有两种解法. 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解.解的个数不够S个 ...
- bzoj1054: [HAOI2008]移动玩具
hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...
- codeforces 333B - Chips
注意:横向纵向交叉时,只要两条边不是正中的边(当n&1!=1),就可以余下两个chip. 代码里数组a[][]第二维下标 0表示横向边,1表示纵向边. #include<stdio.h& ...
- Java [Leetcode 337]House Robber III
题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to ...
- View.VISIBLE、INVISIBLE、GONE的区别
android中UI应用的开发中经常会使用view.setVisibility()来设置控件的可见性,其中该函数有3个可选值,他们有着不同的含义: View.VISIBLE--->可见View. ...
- POJ 3233 Matrix Power Serie
题意:给一个n×n的矩阵A,求S = A + A2 + A3 + … + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...
- [Everyday Mathematics]20150130
计算下列积分 $$\bex \int_0^\infty \frac{\sin^3x}{x^3}\rd x. \eex$$