S number(2016黑龙江省赛J题)
2016-05-24 19:27
429 查看
题意:求[L,R]区间内各位数和是质数的数的数量
Sample Input:
2
4 30
49 173
Sample Output:
12
45
代码:
连续两年没有做出数位dp真的很让人伤心啊(/▽╲)
Sample Input:
2
4 30
49 173
Sample Output:
12
45
代码:
#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int dight[20],dp[20][10][200]; int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151}; int solve(int x){ int i,j,k,ans,sum,len; ans=sum=0,len=1; memset(dight,0,sizeof(dight)); while(x){ dight[len++]=x%10; x/=10; } for(i=len;i>=1;i--){ for(j=0;j<dight[i];j++){ for(k=0;k<36;k++){ if(prime[k]>=sum) ans+=dp[i][j][prime[k]-sum]; } } sum+=dight[i]; //每次加和 } return ans; } int main(){ //dp[i][j][k]表示i位数首位是j和是k int i,j,t,k,l,r; memset(dp,0,sizeof(dp)); for(i=0;i<=9;i++) dp[1][i][i]=1; for(i=2;i<=17;i++){ //预处理 for(j=0;j<=9;j++){ for(k=0;k<=9;k++){ for(l=0;l<=9*i;l++){ if(l>=j) dp[i][j][l]+=dp[i-1][k][l-j]; } } } } scanf("%d",&t); while(t--){ scanf("%d%d",&l,&r); printf("%d\n",solve(r+1)-solve(l)); } return 0; }
连续两年没有做出数位dp真的很让人伤心啊(/▽╲)
相关文章推荐
- HDU 4685 强联通分量+网络流
- 修改 Ubuntu 源(清华大学)
- Linux网络设置
- 【问题】sql数据库安装重启失败
- HDU Common Subsequence(最长公共子序列)
- Linux和其他机器共享文件
- Linux系统启动顺序
- DFS、BFS搜索+题目
- C++迭代器
- 中缀表达式借用栈转换为后缀表达式
- java之十一 Java GUI
- java之十一 Java GUI
- java之十一 Java GUI
- 网络中进程通信-----socket
- Android 传感器大全
- Solr的搭建和部署
- 面向对象的数据结构--vector 向量
- linux虚拟网桥的构建和WAN的连接
- MySQL数据库中的多表数据记录查询
- 验证码60秒倒计时