【HDOJ】1979 Fill the blanks
预处理+搜索剪枝。
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的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
- 【HDOJ】【1512】Monkey King
数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...
随机推荐
- 修改zepto源代码,使支持wp8的ie10
注意:当前1.1.3版本的zepto,已经有模块来支持wp8 原先的zepto,通过__proto__赋值,来使dom继承到$.fn方法, 无奈IE11之前的IE10,IE9不支持这种写法, 所以我们 ...
- 几种placeholder替换项目参数的方法比较
引言:(引自:http://openwebx.org/docs/autoconfig.html) 在一个应用中,我们总是会遇到一些参数,例如: 数据库服务器IP地址.端口.用户名: 用来保存上传资料的 ...
- 配置node与express初试
http://www.nodejs.org/下载对应系统的node版本并安装 用npm包管理器安装需要的包 sudo npm install -g express sudo npm install - ...
- 【学习总结】整理一下int, NSInteger 等概念
基本需要知道的 : unsigned : 没符号的 signed : 有符号的 int : 整型 看看OC的定义 : #if __LP64__ || (TARGET_OS_EMBEDDED & ...
- iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b
用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 ...
- poj 2226 Muddy Fields (转化成二分图的最小覆盖)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- springside springmvc 的一个SB问题
<form id="inputForm" modelAttribute="order" action="${ctx}/myorder/orde ...
- 2336: [HNOI2011]任务调度 - BZOJ
一道随机算法的题目 随便用什么随机算法 首先我们可以想到枚举类型3的最终类型,然后再做 先贪心出一个较优的序列,首先我们知道肯定是在A机器上先做完类型1的事件再做类型2的事件,机器B也类似,因为这些没 ...
- 【概率】COGS 1487:麻球繁衍
Description 万有引力定律: “使物体相互靠近的力的大小与物体的质量成正比——而物体的质量又由同一种力决定.这是一个有趣并且有益的例子,说明了科学是如何用A证明B,再用B证明A的.”——安布 ...
- [转载]AOP面向方面编程
1.引言 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度极地提 ...