HUST team contest #2 A An Industrial Spy ||poj 3842 (筛)
蠢了。
这道题显然可以搜。。
然后自己搜索的姿势果然还是不怎么地。。
最后是蔡大神过掉的。
他的思路是枚举素数,然后把素数的各位拆开,看这些数字是否在给出的字符串中出现过。
一开始TLE掉了。
后来又预处理出来一个标记数组,如果字符串中没有数字2,那么20w+的素数就可以直接跳过去,然后A掉了。
其实因为数字的位数最多才7位。。
暴力也不是不可以。。。。
STL中求全排列的那个函数我也不是没用过。。。比赛的时候怎么就没想到==
再开个map判重
然后素数打表部分。
队友是打了个30000+行的表。。。。
说起来。。。我好像还没用C++写过筛法求素数。。。
说来惭愧啊。。。。
pascal的时候倒是写过几次呢。
再复习下。。。
http://blog.csdn.net/dinosoft/article/details/5829550
写的是快速筛。
1/*************************************************************************
2 > File Name: code/2015summer/0821/A.cpp
3 > Author: 111qqz
4 > Email: rkz2013@126.com
5 > Created Time: 2015年08月20日 星期四 22时17分14秒
6 ************************************************************************/
7
8#include<iostream>
9#include<iomanip>
10#include<cstdio>
11#include<algorithm>
12#include<cmath>
13#include<cstring>
14#include<string>
15#include<map>
16#include<set>
17#include<queue>
18#include<vector>
19#include<stack>
20#define y0 abc111qqz
21#define y1 hust111qqz
22#define yn hez111qqz
23#define j1 cute111qqz
24#define tm crazy111qqz
25#define lr dying111qqz
26using namespace std;
27#define REP(i, n) for (int i=0;i<int(n);++i)
28typedef long long LL;
29typedef unsigned long long ULL;
30const int inf = 0x7fffffff;
31const int N=1E7+7;
32using namespace std;
33
34bool not_prime[N];
35int prime[N],pri_num;
36map<int,bool> mp;
37int a[N];
38int ans;
39map<int,bool>::iterator it;
40char st[15];
41int len;
42void init()
43{
44
45 not_prime[0] =true;
46 not_prime[1] = true;
47
48 for(int i = 2;i < N; ++i)
49 {
50 if(!not_prime[i])
51 prime[++pri_num] = i;
52 for(int j = 1;j <= pri_num && i * prime[j] < N; j++)
53 {
54
55 not_prime[i * prime[j]] = true;
56 if(i % prime[j] == 0) break;
57 }
58 }
59}
60
61void solve()
62{
63
64 int res = 0;
65 for(int i = 1;i <= len; ++i)
66 {
67
68 res = res * 10 + a[i];
69// cout<<"res:"<<res<<endl;
70 if(!not_prime[res] && !mp[res])
71 {
72 mp[res] = true;
73 ans++;
74 }
75 }
76}
77
78int main()
79{
80 init();
81// for ( int i =2 ; i <= 1000 ; i++)
82// {
83// if (!not_prime[i])
84// {
85// cout<<i<<endl;
86// }
87// }
88 int T;
89 cin>>T;
90 while (T--)
91 {
92
93 ans = 0 ;
94 mp.clear();
95 scanf("%s",st+1);
96 len = strlen(st + 1);
97 for(int i = 1;i <= len; i++)
98 {
99 a[i] = st[i] - '0';
100 }
101 sort(a+1,a+len+1);
102 do
103 {
104 solve();
105 }while (next_permutation(a+1,a+len+1));
106
107
108 printf("%d\n",ans);
109 }
110 return 0;
111}
112
113
114/*************************************************************************
115 > File Name: code/2015summer/0821/A.cpp
116 > Author: 111qqz
117 > Email: rkz2013@126.com
118 > Created Time: 2015年08月20日 星期四 22时17分14秒
119 ************************************************************************/
120
121#include<iostream>
122#include<iomanip>
123#include<cstdio>
124#include<algorithm>
125#include<cmath>
126#include<cstring>
127#include<string>
128#include<map>
129#include<set>
130#include<queue>
131#include<vector>
132#include<stack>
133#define y0 abc111qqz
134#define y1 hust111qqz
135#define yn hez111qqz
136#define j1 cute111qqz
137#define tm crazy111qqz
138#define lr dying111qqz
139using namespace std;
140#define REP(i, n) for (int i=0;i<int(n);++i)
141typedef long long LL;
142typedef unsigned long long ULL;
143const int inf = 0x7fffffff;
144const int N=1E7+7;
145using namespace std;
146
147bool not_prime[N];
148int prime[N],pri_num;
149map<int,bool> mp;
150int a[N];
151int ans;
152map<int,bool>::iterator it;
153char st[15];
154int len;
155void init()
156{
157
158 not_prime[0] =true;
159 not_prime[1] = true;
160
161 for(int i = 2;i < N; ++i)
162 {
163 if(!not_prime[i])
164 prime[++pri_num] = i;
165 for(int j = 1;j <= pri_num && i * prime[j] < N; j++)
166 {
167
168 not_prime[i * prime[j]] = true;
169 if(i % prime[j] == 0) break;
170 }
171 }
172}
173
174void solve()
175{
176
177 int res = 0;
178 for(int i = 1;i <= len; ++i)
179 {
180
181 res = res * 10 + a[i];
182// cout<<"res:"<<res<<endl;
183 if(!not_prime[res] && !mp[res])
184 {
185 mp[res] = true;
186 ans++;
187 }
188 }
189}
190
191int main()
192{
193 init();
194// for ( int i =2 ; i <= 1000 ; i++)
195// {
196// if (!not_prime[i])
197// {
198// cout<<i<<endl;
199// }
200// }
201 int T;
202 cin>>T;
203 while (T--)
204 {
205
206 ans = 0 ;
207 mp.clear();
208 scanf("%s",st+1);
209 len = strlen(st + 1);
210 for(int i = 1;i <= len; i++)
211 {
212 a[i] = st[i] - '0';
213 }
214 sort(a+1,a+len+1);
215 do
216 {
217 solve();
218 }while (next_permutation(a+1,a+len+1));
219
220
221 printf("%d\n",ans);
222 }
223 return 0;
224}
225
226
227v