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

 /* 1979 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <bitset>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct node_t {
char s[]; node_t() {}
node_t(int a[][]) {
int l = ;
rep(i, , )
rep(j, , )
s[l++] = a[i][j]+'';
s[l] = '\0';
} friend bool operator< (const node_t& a, const node_t& b) {
return strcmp(a.s, b.s)< ? true:false;
} friend bool operator== (const node_t& a, const node_t& b) {
return strcmp(a.s, b.s)==;
} friend bool operator!= (const node_t& a, const node_t& b) {
return strcmp(a.s, b.s)!=;
} void print() {
for (int i=; i<; i+=) {
for (int j=; j<; ++j)
putchar(s[i+j]);
putchar('\n');
}
} } node_t; const int maxn = ;
bool isPrime[maxn];
bool valid[maxn];
int a[maxn], an;
int b[maxn], bn;
int c[maxn], cn;
bool M03[][];
vector<node_t> ans;
vi AV21[];
vi AV30[];
vi CV21[];
vi CV30[];
int M[][]; void getV(int* a, int n, vi vc30[], vi vc21[]) {
int d[]; rep(i, , n) {
int x = a[i];
rep(j, , ) {
d[j] = x % ;
x /= ;
}
int v30 = d[]*+d[];
int v21 = d[]*+d[];
vc30[v30].pb(v21);
vc21[v21].pb(v30);
} vi::iterator iter;
rep(i, , ) {
sort(all(vc30[i]));
iter = unique(all(vc30[i]));
vc30[i].erase(iter, vc30[i].end()); sort(all(vc21[i]));
iter = unique(all(vc21[i]));
vc21[i].erase(iter, vc21[i].end());
}
} void init() {
int i, j, k;
int x;
int d[]; an = bn = cn = ;
memset(isPrime, true, sizeof(isPrime));
memset(valid, false, sizeof(valid));
isPrime[] = isPrime[] = false; for (i=; i<maxn; ++i) {
if (isPrime[i]) {
b[bn++] = i;
for (j=i*i; j<maxn; j+=i)
isPrime[j] = false;
}
} memset(M03, false, sizeof(M03));
for (i=; i<bn; ++i) {
x = b[i];
if (valid[x])
continue;
for (j=; j<; ++j) {
d[j] = x % ;
x /= ;
}
if ((d[]&)== || (d[]&)==)
continue;
x = ;
for (j=; j<; ++j) {
x = x * + d[j];
}
if (isPrime[x]) {
valid[x] = valid[b[i]] = true;
a[an++] = x;
a[an++] = b[i];
M03[d[]][d[]] = M03[d[]][d[]] = true;
bool flag = true;
for (j=; j<; ++j) {
if ((d[j] & )==) {
flag = false;
break;
}
}
if (flag) {
c[cn++] = x;
c[cn++] = b[i];
}
}
} sort(a, a+an);
an = unique(a, a+an) - a;
sort(c, c+cn);
cn = unique(c, c+cn) - c; getV(a, an, AV30, AV21);
getV(c, cn, CV30, CV21);
} void solve_() {
int v30 = *M[][]+M[][];
int v30_ = *M[][]+M[][]; int sz = SZ(AV30[v30]);
int sz_ = SZ(AV30[v30_]);
rep(i, , sz) {
int v21 = AV30[v30][i];
M[][] = v21/;
M[][] = v21%;
rep(j, , sz_) {
int v21_ = AV30[v30_][j];
M[][] = v21_/;
M[][] = v21_%; int v1 = M[][]*+*M[][]+M[][]*+M[][];
int v2 = M[][]*+*M[][]+M[][]*+M[][];
int v3 = M[][]*+*M[][]+M[][]*+M[][];
int v4 = M[][]*+*M[][]+M[][]*+M[][]; if (valid[v1] && valid[v2] && valid[v3] && valid[v4]) {
ans.pb(node_t(M));
}
}
}
} void solve() {
int d1[];
int d2[];
int d3[]; rep(i, , cn) {
int x = c[i];
rep(dd, , ) {
d1[dd] = x % ;
x /= ;
}
int f1 = d1[];
int e1 = d1[];
rep(j, , cn) {
int x = c[j];
rep(dd, , ) {
d2[dd] = x % ;
x /= ;
}
int f2 = d2[];
int e2 = d2[];
if (f1 != f2)
continue;
rep(k, , cn) {
int x = c[k];
rep(dd, , ) {
d3[dd] = x % ;
x /= ;
}
int f3 = d3[];
int e3 = d3[];
if (f3 != e1)
continue; int v30 = e2* + e3;
int sz_CV30 = SZ(CV30[v30]);
rep(ii, , sz_CV30) {
int v21 = CV30[v30][ii];
int x3 = v21/;
int y3 = v21%; M[][] = d1[];
M[][] = d1[];
M[][] = d1[];
M[][] = d1[]; M[][] = d2[];
M[][] = d2[];
M[][] = d2[]; M[][] = d3[];
M[][] = d3[];
M[][] = d3[]; M[][] = x3;
M[][] = y3; solve_();
}
}
}
}
} void print() {
sort(all(ans));
vector<node_t>::iterator iter = unique(all(ans));
ans.erase(iter, ans.end());
int sz = SZ(ans);
ans[].print();
rep(i, , sz) {
putchar('\n');
ans[i].print();
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif init();
solve();
print(); #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【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. DTCMS自定义标签,获取所有栏目文章列表TOP,以及文章通用URL

    网站最近更新等地方,发现DTCMS没有获取所有栏目文章列表的标签,只能自己写 思路:获取所有栏目文章列表不难,难点在于linkurl的写法 1.制作获取所有文章列表标签 DTcms.Web.UI\La ...

  2. spring-cloud-feign案例

    主要依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springf ...

  3. RHEL 7.2 安装Oracle XE-11.2.0

    轻量快捷版本,适合开发 0. /etc/hosts 添加 本机hostname # hostnamepromote.cache-dns.local # cat /etc/hosts127.0.0.1 ...

  4. Demo学习: Collapsible Panels

    Collapsible Panels 设置TUniPanel布局属性,布局属性在Ext里是比较常用的属性,当前版本虽已经提供了布局功能,但很不完善,比如当Panel.TitlePosition=tpR ...

  5. linux系统文件属性及企业精典故障案例

    linux系统文件属性: [root@nginx_back ~]# stat keepalived-1.2.7.tar.gz 查看文件属性 File: "keepalived-1.2.7.t ...

  6. Django开发网站(二)

    第一课:视图显示 1   建立一个项目:django-admin startproject blog, 进入blog: cd blog 显示:blog(__init__.py settings.py ...

  7. linux -- 启动时启动服务或者执行命令

    运行等级 首先,我们需要知道Linux系统关于运行等级的知识.在不同的linux系统上(例如ubuntu和Fedora)这些数字与和所代表的意义可能不同,但主要的有以下几个: 单用户模式. 多用户模式 ...

  8. 图像处理-07-图像的轮廓提取-Robert算子

    图像的轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间.物体与物体之间,基元与基元之间,是图像分割的重要依据. 物体的边缘是由 ...

  9. Kinetic使用注意点--collection

    new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...

  10. psutil--跨平台的进程管理

    原文地址:http://www.jianshu.com/p/64e265f663f6 Python处理Windows进程 psutil(Python system and process utilit ...