Vijos 捕风捉影

背景

《风云》里有详细记载,自己去看吧^_^...

描述

有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀。风:你给我闭嘴。)捕风捉影的关键是换气(换不好就会大喘气...)。

使用捕风捉影这一招时并不是每一步都喘气,而是在特定的步数喘气。一般来说功力越高,喘气越稀疏。喘气的步数符合特定规律:第一要是SUSHU(弟子二:哇塞!堂主,你还会鸟语,我好好崇拜你呦!可是SUSHU是什么意思呢?风:笨蛋,那是汉语拼音!)第二要是一个回文数,回文数就是正反念一样的数,如:123321,121,5211314(弟子三:堂主,最后一个好象不是...风:废话,当然不是了,我是考察一下你们的纠错能力!)现在给出两个数M,N(5<=M<N<=100,000,000),你要算出M,N之间需要换气的都有哪几步。(包括M,N)。算出来的可以提升为本堂一级弟子,月薪(1000000000000000000000000000000000000000000 MOD 10 )元。

格式

输入格式

两个整数M,N。用空格隔开。

输出格式

在M,N之间的换气点,每个一行。

样例1

样例输入1

100 500
Copy

样例输出1

101
131
151
181
191
313
353
373
383
Copy

来源

来自天下会神风堂主

 

 1 /*
 2     乍一看数据范围很大
 3     其实只需要注意两点就行了
 4     这个回文素数必定是2n-1位 2n位回文数必定被11整除
 5     回文数第一位只能是1 3 7 9
 6     把回文数表打出来在判断就好了 
 7 */
 8 #include<cmath>
 9 #include<cstdio>
10 #include<iostream>
11 #include<algorithm>
12 #define MAXN 1010
13 
14 using namespace std;
15 
16 int n,m,cnt;
17 int a[MAXN];
18 
19 inline void read(int&x) {
20     x=0;int f=1;char c=getchar();
21     while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
22     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-48;c=getchar();}
23     x=x*f;
24 }
25 
26 inline bool pd(int x) {
27     for(int i=2;i<=sqrt(x);i++)
28       if(x%i==0) return false;
29     return true;
30 }
31 
32 inline void sushu() {
33     for(int i=1;i<=9;i+=2) {
34         if(pd(i*10+i)) a[++cnt]=i*10+i;
35           if(i!=5)
36         for(int j=0;j<=9;j++) {
37             if(pd(i*100+j*10+i)) a[++cnt]=i*100+j*10+i;
38             for(int k=0;k<=9;k++) {
39                 if(pd(i*10000+j*1000+k*100+j*10+i)) a[++cnt]=i*10000+j*1000+k*100+j*10+i;
40                 for(int l=0;l<=9;l++) {
41                     if(pd(i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i))
42                       a[++cnt]=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
43                 }
44             }
45         }
46       }
47 }
48 
49 int main() {
50     read(n);read(m);
51     a[++cnt]=5;a[++cnt]=7;
52     sushu();
53     sort(a+1,a+1+cnt);
54     for(int i=1;i<=cnt;i++) 
55       if(a[i]>=n&&a[i]<=m)
56         printf("%d\n",a[i]);
57     //printf("%d\n",cnt);
58     return 0;
59 }
代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值