scauoj 18025 小明的密码 数位DP
18025 小明的密码
时间限制:4000MS 内存限制:65535K
提交次数:0 通过次数:0题型: 编程题 语言: G++;GCC
Description
小明的密码由N(1<=N<=12)个数字构成,每个数字都可以是0至9中任意一个数字,但小明的密码还有
一个特点就是密码中连续的M(1<=M<=4)个数字的和是质数,现给定M和N,求满足条件的密码共有多少
个?输入格式
第1行是T,case数量,此后T行,每行两个数,N和M输出格式
每个case输出一个满足条件的密码总数输入样例
2
1 1
2 1输出样例
4
16
这题数据很小,可以直接DFS暴力求解,但是有更好的DP思路。。不过代码略长dp[i][j][k][z],i表示当前是几位数,j表示当前这个数的最后一位,k,z分别是倒数二、三位。
假设M=4时.如果j+k+z+a是素数的时候,dp[i-1][k][z][a]可以推出dp[i][j][k][z],也就是dp[i][j][k][z]+=dp[i-1][k][z][a];
这样一来,我们就可以用暴力的方法求出dp[4][j][k][z],然后递推上去。时间复杂度是n*10^m
下面是代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
typedef long long ll;
#define X first
#define Y second
#define mp(a,b) make_pair(a,b)
#define pb push_back
#define sd(x) scanf("%d",&(x))
#define Pi acos(-1.0)
#define sf(x) scanf("%lf",&(x))
#define ss(x) scanf("%s",(x))
#define maxn 1000000
#include <ctime>
//如果是学校的同学要把这个删掉,因为学校OJ禁了time头文件.
const int inf=0x3f3f3f3f;
const long long mod=;
using namespace std;
int dp[][][][];
long long ans[][];
bool prime[];
void get_prime()
{
prime[]=prime[]=;
for(int i=;i<=;i++)
{
if(!prime[i])
{
for(int j=i+i;j<=;j+=i)
prime[j]=;
}
}
}
void init()
{
ans[][]=;
//M=1
for(int i=;i<=;i++)
ans[i][]=ans[i-][]*;
//M=2
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(!prime[i+j])
dp[][][][i]++;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
if(!prime[j+k])
dp[i][][][j]+=dp[i-][][][k];
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans[i][]+=dp[i][][][j]; //M=3
memset(dp,,sizeof dp);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
if(!prime[i+j+k])
dp[][][i][j]++;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
for(int z=;z<=;z++)
if(!prime[j+k+z])
dp[i][][j][k]+=dp[i-][][k][z];
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
ans[i][]+=dp[i][][j][k]; //M=4
memset(dp,,sizeof dp);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
for(int z=;z<=;z++)
if(!prime[i+j+k+z])
dp[][i][j][k]++;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
for(int z=;z<=;z++)
for(int a=;a<=;a++)
if(!prime[j+k+z+a])
dp[i][j][k][z]+=dp[i-][k][z][a];
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
for(int a=;a<=;a++)
ans[i][]+=dp[i][j][k][a];
}
int main()
{
#ifdef local
freopen("in","r",stdin);
//freopen("out","w",stdout);
int _time=clock();
#endif
get_prime();
init();
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
cout<<ans[n][m]<<endl;
}
#ifdef local
printf("time: %d\n",int(clock()-_time));
#endif
}
scauoj 18025 小明的密码 数位DP的更多相关文章
- 小明的密码-初级DP解法
#include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- SCUT - 289 - 小O的数字 - 数位dp
https://scut.online/p/289 一个水到飞起的模板数位dp. #include<bits/stdc++.h> using namespace std; typedef ...
- 5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题
LINK:小V和字符串 容易想到只有1个数相同的 才能有贡献. 知道两个01串 那么容易得到最小步数 大体上就是 第一个串的最前的1和第二个串最前的1进行匹配. 容易想到设f[i][j]表示 前i位1 ...
- Codeforces 1290F - Making Shapes(数位 dp)
Codeforces 题面传送门 & 洛谷题面传送门 数位 dp 好题. 首先,由于是凸包,一但向量集合确定,凸包的形态肯定就已经确定了.考虑什么样的向量集合能够组成符合条件的凸包,我们假设第 ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
- 牛客寒假算法基础集训营3处女座和小姐姐(三) (数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)
Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则: 1.如果小明 ...
随机推荐
- PHP中的for循环
循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都会把 ...
- Learning to Rank简介
Learning to Rank是采用机器学习算法,通过训练模型来解决排序问题,在Information Retrieval,Natural Language Processing,Data Mini ...
- HBase应用快速学习
HBase是一个高性能.面向列.可伸缩的开源分布式NoSQL数据库,是Google Bigtable的开源实现. HBase的思想和应用和传统的RDBMS,NoSQL等有比较大的区别,这篇文章从HBa ...
- leetcode中Database题(一)
Combine Two Tables Table: Person +-------------+---------+ | Column Name | Type | +-------------+--- ...
- CSS 预处理器中的循环
本文由 nzbin 翻译,黄利民 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/91016/ 如果你看过老的科幻电影,你一 ...
- 生成订单:三个表(Products,Orders,OrderItem)
1.有三个表(Product上,Orders,OrderItem) 分别创建对应的三个实体类 OrderItem中有外键Order_id 参考Orders中的id :Product_id参考Produ ...
- yii2.0套用模板问题
载入视图 在控制器中: $this->render(); 会加载布局 $this->renderPartial(); 不会加载布局(也不能载入框架自带的jquery等) Yii2 选择布局 ...
- Java异常分类及处理
1.Throwable是所有异常的根(java.lang.Throwable)2.Error是错误(java.lang.Error) 当程序发生不可控的错误时,程序会报错,Error及其子类的对象不应 ...
- app测试特点
一.安装与卸载1.软件安装后是否可以正常运行:2.安装过程中是否可以中断3.安装空间不足时是否有相应的提示4.是否可以卸载应用(桌面卸载和应用卸载)二.权限测试1.扣费风险:包括发送短信.拨打电话.连 ...
- C#总结(二)事件Event 介绍总结
最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...