您的位置:首页 > 其它

S number(2016黑龙江省赛J题)

2016-05-24 19:27 429 查看
题意:求[L,R]区间内各位数和是质数的数的数量

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真的很让人伤心啊(/▽╲)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: