博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1230:幸运数
阅读量:7015 次
发布时间:2019-06-28

本文共 1413 字,大约阅读时间需要 4 分钟。

51nod 1230:幸运数

题目链接:

题目大意:如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数。例如:120是幸运数,因为120的数字之和为3,平方和为5,均为质数,所以120是一个幸运数字。给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数。

数位DP

代码如下:

1 #include 
2 #include
3 using namespace std; 4 typedef long long ll; 5 const int maxn=22; 6 int dig[maxn],prime[1459]={
0},num_prime=0,T; 7 ll f[maxn][163][1459],x,y; 8 bool p[1459]={
1,1}; 9 ll dfs(int pos,int sum,int sqrsum,int limit){10 if (pos<0) return (!p[sum])&&(!p[sqrsum]);11 if (!limit&&f[pos][sum][sqrsum]!=-1) return f[pos][sum][sqrsum];12 ll res=0;13 int last=limit?dig[pos]:9;14 for (int i=0;i<=last;i++){15 res+=dfs(pos-1,sum+i,sqrsum+i*i,limit&&(i==last));16 }17 if (!limit) f[pos][sum][sqrsum]=res;18 return res;19 }20 ll solve(ll n){21 int len=0;22 while (n){23 dig[len++]=n%10;24 n/=10;25 }26 return dfs(len-1,0,0,1);27 }28 void init(){29 memset(f,-1,sizeof(f));30 for(long i=2;i<1459;i++){31 if(!p[i])prime[num_prime++]=i;32 for(long j=0;j
<1459;j++){33 p[i*prime[j]]=1;34 if(!(i%prime[j]))break;35 }36 }37 }38 int main(void){39 init();40 scanf("%d",&T);41 while(T--){42 scanf("%lld%lld",&x,&y);43 printf("%lld\n",solve(y)-solve(x-1));44 }45 }

 

转载于:https://www.cnblogs.com/barrier/p/6725764.html

你可能感兴趣的文章
hdu 3307 Description has only two Sentences (欧拉函数+快速幂)
查看>>
align-items和align-content的区别
查看>>
POJ 2255 Tree Recovery【二叉树重建】
查看>>
别盯着杯子
查看>>
Divide Two Integers
查看>>
MPlayer-2016 最新版本
查看>>
HTML5:Canvas-基本用法
查看>>
{WP7/WP8·获取屏幕大小}
查看>>
Java面向对象(构造方法、this、super)
查看>>
Mysql中的索引问题
查看>>
如何调用windows phone 7.1的后台闹钟功能 step by step
查看>>
多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)...
查看>>
portal中应用fusionchart
查看>>
琐碎-hadoop1.X和2.X的区别
查看>>
Java “Unhandled exception type Exception”错误提示 (转)
查看>>
PHP源码之explode分析
查看>>
怪叔叔 一路走好 下辈子我们再一起玩KOF
查看>>
B.华华教月月做数学
查看>>
Log4j配置详情
查看>>
Oracle 的四种连接-左外连接、右外连接、内连接、全连接
查看>>