NEUQ OJ 2004:追梦之人 (计数数位dp)
2004: 追梦之人
题目描述:
为了纪念追梦人,粉丝们创造了一种新的数——“追梦数”。追梦数要满足以下两个条件:
1、数字中不能出现“7”
2、不能被7整除。
比如:777和4396就不是追梦数,而666是追梦数。现在他们想知道,1到N中有多少个追梦数。
输入:
多组数据。
第一行给出一个正整数T。T为数据组数。
接下来T行,每行包括一个正整数N。
(1 \leq T \leq 10001≤T≤1000)
(1 \leq N \leq 10^{18}1≤N≤1018)
输出:
对于每组数据,在单独的一行中输出一个整数表示1到N中有多少个追梦数。
- 4
10
14
17
100
- 9
12
14
70
当初石乐志要维护三个东西,后来发觉数位只要维护两个东西就好了。
我们的答案是n-被7整除的数-不被7整除但包含7的数。
被7整除的数n/7即可求出。
后面这个写个数位dp即可。
dpi[k]表示长度为i,膜7的余数为j,是否含7的情况为k(k为0表示不含,为1表示含)的数的数量,考虑当前的第i位为x,之前的i-1位组成的数膜7的余数为y,那么dpi+=dpi-1。如果x不是7,那么k应该是0转移到0,1转移到1;如果x是7,那么都转移到k=1。剩下的就是裸的数位dp了。
注意边界。
- #include<bits/stdc++.h>
- #define clr(x) memset(x,0,sizeof(x))
- #define clr_1(x) memset(x,-1,sizeof(x))
- #define mod 7
- #define LL long long
- #define INF 0x3f3f3f3f
- #define mp make_pair
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- using namespace std;
- const int N=1e5+;
- LL all[][][],num[];
- void init()
- {
- all[][][]=;
- num[]=;
- for(int i=;i<=;i++)
- num[i]=(num[i-]*)%mod;
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- for(int k=;k<;k++)
- if(j!=)
- {
- all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][];
- all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][];
- }
- else
- all[i][(int)(j*num[i]%mod+k)%mod][]+=all[i-][k][]+all[i-][k][];
- }
- LL n,m,k;
- LL ans;
- int a[N],t,now;
- bool flag;
- int T;
- int main()
- {
- init();
- scanf("%d",&T);
- while(T--)
- {
- scanf("%lld",&n);
- ans=n-n/;
- m=;
- n++;
- while(n)
- {
- a[++m]=n%;
- n/=;
- }
- now=;
- flag=;
- for(int i=m;i>=;i--)
- {
- for(int j=;j<a[i];j++)
- {
- for(int k=;k<mod;k++)
- if((j*num[i]%mod+k+now)%mod!=)
- {
- ans-=all[i-][k][];
- if(flag || j==mod)
- ans-=all[i-][k][];
- }
- }
- now=(now+a[i]*num[i])%mod;
- if(a[i]==mod)
- flag=;
- }
- printf("%lld\n",ans);
- }
- }
NEUQ OJ 2004:追梦之人 (计数数位dp)的更多相关文章
- 【BZOJ-1833】count数字计数 数位DP
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2494 Solved: 1101[Submit][ ...
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- 【题解】P2602 数字计数 - 数位dp
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...
- 目标管理剖析与实践– 献给追梦的人 (转)
好久没写日志了. 最近总算在忙碌的日子中小小的松了一口气, 过来补起这几个月的空缺. 上次写的Cover Letter & Resume 重点诠释 - 深度剖析没想到居然超过了一万的阅读量 ...
- UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- 【BZOJ1833】【ZJOI2010】数字计数 数位DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...
- [Swust OJ 715]--字典序问题(组合数预处理/数位dp)
题目链接:http://acm.swust.edu.cn/problem/715/ Time limit(ms): 1000 Memory limit(kb): 65535 在数据加密和数据压缩中 ...
随机推荐
- 状压dp(B - 炮兵阵地 POJ - 1185 )
题目链接:https://cn.vjudge.net/contest/276236#problem/B 题目大意:略 具体思路:和我的上一篇写状压dp的思路差不多,不过就是这个题相当于上一个题的升级 ...
- 20165227 实验二《Java面向对象程序设计》实验报告
2017-2018-4 20165227实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- 修复TortoiseGit文件夹和文件图标不显示问题的多种解决办法以及重启之后TortoiseGit图标注册表又不见了的解决办法
一 首先进行第一种尝试 打开 regedit.exe ,准备修改注册表 找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ...
- pom可以过滤resource 下的文件
- tf.summary.merge_all()
1.自动管理模式 summary_writer = tf.summary.FileWriter('E:/data/tensorflow-master/1.Cnn_Captcha/result/', f ...
- PlantUML——4.实例演示1
给自己发消息 @startuml Alice -> Alice : This is a signal to self.\nIt also demonstrates \nmultiline tex ...
- 使用html+css+js实现倒计时,开启你痛苦的倒计时吧
使用html+css+js实现倒计时,开启你痛苦的倒计时吧 效果图: 这是我痛苦的倒计时,呜呜呜 好啦,再痛苦还是要分享代码,代码如下,复制即可使用: <!DOCTYPE html> &l ...
- log4j记录日志到指定文件
新建类文件: import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * 记录日志到指定文件 ...
- hdu 5122 (2014北京现场赛 K题)
把一个序列按从小到大排序 要执行多少次操作 只需要从右往左统计,并且不断更新最小值,若当前数为最小值,则将最小值更新为当前数,否则sum+1 Sample Input255 4 3 2 155 1 2 ...
- hdu 5131 (2014广州现场赛 E题)
题意:对给出的好汉按杀敌数从大到小排序,若相等,按字典序排.M个询问,询问名字输出对应的主排名和次排名.(排序之后)主排名是在该名字前比他杀敌数多的人的个数加1,次排名是该名字前和他杀敌数相等的人的个 ...