预处理+搜索剪枝。
4*4的边界上的数字必须是奇数。

  1. /* 1979 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <bitset>
  12. #include <algorithm>
  13. #include <cstdio>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <cstring>
  17. #include <climits>
  18. #include <cctype>
  19. #include <cassert>
  20. #include <functional>
  21. #include <iterator>
  22. #include <iomanip>
  23. using namespace std;
  24. //#pragma comment(linker,"/STACK:102400000,1024000")
  25.  
  26. #define sti set<int>
  27. #define stpii set<pair<int, int> >
  28. #define mpii map<int,int>
  29. #define vi vector<int>
  30. #define pii pair<int,int>
  31. #define vpii vector<pair<int,int> >
  32. #define rep(i, a, n) for (int i=a;i<n;++i)
  33. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  34. #define clr clear
  35. #define pb push_back
  36. #define mp make_pair
  37. #define fir first
  38. #define sec second
  39. #define all(x) (x).begin(),(x).end()
  40. #define SZ(x) ((int)(x).size())
  41. #define lson l, mid, rt<<1
  42. #define rson mid+1, r, rt<<1|1
  43.  
  44. typedef struct node_t {
  45. char s[];
  46.  
  47. node_t() {}
  48. node_t(int a[][]) {
  49. int l = ;
  50. rep(i, , )
  51. rep(j, , )
  52. s[l++] = a[i][j]+'';
  53. s[l] = '\0';
  54. }
  55.  
  56. friend bool operator< (const node_t& a, const node_t& b) {
  57. return strcmp(a.s, b.s)< ? true:false;
  58. }
  59.  
  60. friend bool operator== (const node_t& a, const node_t& b) {
  61. return strcmp(a.s, b.s)==;
  62. }
  63.  
  64. friend bool operator!= (const node_t& a, const node_t& b) {
  65. return strcmp(a.s, b.s)!=;
  66. }
  67.  
  68. void print() {
  69. for (int i=; i<; i+=) {
  70. for (int j=; j<; ++j)
  71. putchar(s[i+j]);
  72. putchar('\n');
  73. }
  74. }
  75.  
  76. } node_t;
  77.  
  78. const int maxn = ;
  79. bool isPrime[maxn];
  80. bool valid[maxn];
  81. int a[maxn], an;
  82. int b[maxn], bn;
  83. int c[maxn], cn;
  84. bool M03[][];
  85. vector<node_t> ans;
  86. vi AV21[];
  87. vi AV30[];
  88. vi CV21[];
  89. vi CV30[];
  90. int M[][];
  91.  
  92. void getV(int* a, int n, vi vc30[], vi vc21[]) {
  93. int d[];
  94.  
  95. rep(i, , n) {
  96. int x = a[i];
  97. rep(j, , ) {
  98. d[j] = x % ;
  99. x /= ;
  100. }
  101. int v30 = d[]*+d[];
  102. int v21 = d[]*+d[];
  103. vc30[v30].pb(v21);
  104. vc21[v21].pb(v30);
  105. }
  106.  
  107. vi::iterator iter;
  108. rep(i, , ) {
  109. sort(all(vc30[i]));
  110. iter = unique(all(vc30[i]));
  111. vc30[i].erase(iter, vc30[i].end());
  112.  
  113. sort(all(vc21[i]));
  114. iter = unique(all(vc21[i]));
  115. vc21[i].erase(iter, vc21[i].end());
  116. }
  117. }
  118.  
  119. void init() {
  120. int i, j, k;
  121. int x;
  122. int d[];
  123.  
  124. an = bn = cn = ;
  125. memset(isPrime, true, sizeof(isPrime));
  126. memset(valid, false, sizeof(valid));
  127. isPrime[] = isPrime[] = false;
  128.  
  129. for (i=; i<maxn; ++i) {
  130. if (isPrime[i]) {
  131. b[bn++] = i;
  132. for (j=i*i; j<maxn; j+=i)
  133. isPrime[j] = false;
  134. }
  135. }
  136.  
  137. memset(M03, false, sizeof(M03));
  138. for (i=; i<bn; ++i) {
  139. x = b[i];
  140. if (valid[x])
  141. continue;
  142. for (j=; j<; ++j) {
  143. d[j] = x % ;
  144. x /= ;
  145. }
  146. if ((d[]&)== || (d[]&)==)
  147. continue;
  148. x = ;
  149. for (j=; j<; ++j) {
  150. x = x * + d[j];
  151. }
  152. if (isPrime[x]) {
  153. valid[x] = valid[b[i]] = true;
  154. a[an++] = x;
  155. a[an++] = b[i];
  156. M03[d[]][d[]] = M03[d[]][d[]] = true;
  157. bool flag = true;
  158. for (j=; j<; ++j) {
  159. if ((d[j] & )==) {
  160. flag = false;
  161. break;
  162. }
  163. }
  164. if (flag) {
  165. c[cn++] = x;
  166. c[cn++] = b[i];
  167. }
  168. }
  169. }
  170.  
  171. sort(a, a+an);
  172. an = unique(a, a+an) - a;
  173. sort(c, c+cn);
  174. cn = unique(c, c+cn) - c;
  175.  
  176. getV(a, an, AV30, AV21);
  177. getV(c, cn, CV30, CV21);
  178. }
  179.  
  180. void solve_() {
  181. int v30 = *M[][]+M[][];
  182. int v30_ = *M[][]+M[][];
  183.  
  184. int sz = SZ(AV30[v30]);
  185. int sz_ = SZ(AV30[v30_]);
  186. rep(i, , sz) {
  187. int v21 = AV30[v30][i];
  188. M[][] = v21/;
  189. M[][] = v21%;
  190. rep(j, , sz_) {
  191. int v21_ = AV30[v30_][j];
  192. M[][] = v21_/;
  193. M[][] = v21_%;
  194.  
  195. int v1 = M[][]*+*M[][]+M[][]*+M[][];
  196. int v2 = M[][]*+*M[][]+M[][]*+M[][];
  197. int v3 = M[][]*+*M[][]+M[][]*+M[][];
  198. int v4 = M[][]*+*M[][]+M[][]*+M[][];
  199.  
  200. if (valid[v1] && valid[v2] && valid[v3] && valid[v4]) {
  201. ans.pb(node_t(M));
  202. }
  203. }
  204. }
  205. }
  206.  
  207. void solve() {
  208. int d1[];
  209. int d2[];
  210. int d3[];
  211.  
  212. rep(i, , cn) {
  213. int x = c[i];
  214. rep(dd, , ) {
  215. d1[dd] = x % ;
  216. x /= ;
  217. }
  218. int f1 = d1[];
  219. int e1 = d1[];
  220. rep(j, , cn) {
  221. int x = c[j];
  222. rep(dd, , ) {
  223. d2[dd] = x % ;
  224. x /= ;
  225. }
  226. int f2 = d2[];
  227. int e2 = d2[];
  228. if (f1 != f2)
  229. continue;
  230. rep(k, , cn) {
  231. int x = c[k];
  232. rep(dd, , ) {
  233. d3[dd] = x % ;
  234. x /= ;
  235. }
  236. int f3 = d3[];
  237. int e3 = d3[];
  238. if (f3 != e1)
  239. continue;
  240.  
  241. int v30 = e2* + e3;
  242. int sz_CV30 = SZ(CV30[v30]);
  243. rep(ii, , sz_CV30) {
  244. int v21 = CV30[v30][ii];
  245. int x3 = v21/;
  246. int y3 = v21%;
  247.  
  248. M[][] = d1[];
  249. M[][] = d1[];
  250. M[][] = d1[];
  251. M[][] = d1[];
  252.  
  253. M[][] = d2[];
  254. M[][] = d2[];
  255. M[][] = d2[];
  256.  
  257. M[][] = d3[];
  258. M[][] = d3[];
  259. M[][] = d3[];
  260.  
  261. M[][] = x3;
  262. M[][] = y3;
  263.  
  264. solve_();
  265. }
  266. }
  267. }
  268. }
  269. }
  270.  
  271. void print() {
  272. sort(all(ans));
  273. vector<node_t>::iterator iter = unique(all(ans));
  274. ans.erase(iter, ans.end());
  275. int sz = SZ(ans);
  276. ans[].print();
  277. rep(i, , sz) {
  278. putchar('\n');
  279. ans[i].print();
  280. }
  281. }
  282.  
  283. int main() {
  284. ios::sync_with_stdio(false);
  285. #ifndef ONLINE_JUDGE
  286. freopen("data.in", "r", stdin);
  287. freopen("data.out", "w", stdout);
  288. #endif
  289.  
  290. init();
  291. solve();
  292. print();
  293.  
  294. #ifndef ONLINE_JUDGE
  295. printf("time = %d.\n", (int)clock());
  296. #endif
  297.  
  298. return ;
  299. }

【HDOJ】1979 Fill the blanks的更多相关文章

  1. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  2. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  3. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  4. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  5. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  6. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  7. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

  8. 【HDOJ】【3068】最长回文

    Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...

  9. 【HDOJ】【1512】Monkey King

    数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...

随机推荐

  1. HTTP 错误 404.2 解决方案

    HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误 404.2 - Not Found ...

  2. 前端工程模块化——以一个php项目为例

    实现一个页面功能总是需要 JavaScript.CSS 和 Template 三种语言相互组织,所以我们真正需要的是一种可以将 JavaScript.CSS 和 Template 同时都考虑进去的模块 ...

  3. asp.net 点击按钮,页面没有任何变化,后台代码不触发

    asp.net 点击按钮,页面没有任何变化,后台代码不触发 和可能是 asp.net button  缺少validationGroup 导致的,需要查看页面的validation并且让他们抛出错误信 ...

  4. Node.js之【正则表达式函数之match、test、exec、search、split、replace使用详解】

    1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...

  5. mysql中的if条件语句用法

    · IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2;  ...

  6. 解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)

    从事WPF开发一年有余,对于图片显示模糊相信很多人都遇到过.网络上查找能得到一堆解决方法,但都是会带来其他负面影响得不到最佳效果.其实,有些图片会因为垂直分辨率/水平分辨率不同而造成在WPF界面上显示 ...

  7. EXTJS 4.2 资料 控件之textfield文本框加事件的用法

    { xtype: "textfield", width: 100, id: "txtGroupName", name: "txtGroupName&q ...

  8. MYSQL系列1_MySQL的安装,可视化工具的使用,以及建库建表等

    大家都知道MYSQL是开源的数据库,现在MYSQL在企业中的使用也越来越多,本人之前用过SQL SERVER数据库,因业务需要和自己的兴趣想要学习MYSQL,对于MYSQL,本人还是新手,请大家多多指 ...

  9. bnu 4358 左手定则 (搜索)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4358 [题意]:给定起始位置和方向和目的地,按照左转.前进.右转.后退的优先级递减,也就是说能左转就 ...

  10. poj 1236 Network of Schools(又是强连通分量+缩点)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...