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

来源:互联网 发布:天际原版捏脸数据 编辑:程序博客网 时间:2024/04/20 09:23

题意:求[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真的很让人伤心啊(/▽╲)

1 0