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

本文共 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

你可能感兴趣的文章
监视DNS服务器工作是否正常
查看>>
理解并取证:动态路由协议RIP的工作原理
查看>>
你也可以拥有F5
查看>>
Windows Server 2012 Release Candidate (RC发行预览版) Datacenter抢鲜看
查看>>
疯狂ios讲义之疯狂连连看游戏简介
查看>>
shell编程培训之shell的工作原理
查看>>
Linux环境变量配置介绍及实战
查看>>
【VMCloud云平台】SCCM (九)添加报表点
查看>>
有关puppet agent端三种备份恢复方案探讨研究
查看>>
Linux下/etc/fstab文件详解
查看>>
统一沟通-技巧-13-Lync-Polycom RMX 1500-配置
查看>>
WindowsServer 2008 R2 Active Directory PowerShell
查看>>
大数据虚拟化零起点-3基础运维第二步-安装vSphere 5.1
查看>>
App-V5.0服务器部署
查看>>
Gartner:2012年大数据HypeCycle
查看>>
Lync 小技巧-4-我是否应该用动态内存
查看>>
写给同事的一封信
查看>>
详解Kafka生产者Producer配置
查看>>
SQL Server 2012笔记分享-9:理解列存储索引
查看>>
基于2.8版本redis配置文件中文解释
查看>>