【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 ...
随机推荐
- MVC3缓存:使用页面缓存
在以前的WebForm的开发中,在页面的头部加上OutputCache即可启用页面缓存,而在MVC3中,使用了Razor模板引擎的话,该如何使用页面缓存呢?如何启用 在MVC3中要如果要启用页面缓存, ...
- Jquery get parameter value
http://www.sitepoint.com/url-parameters-jquery/ $.urlParam('id') ==> $.urlParam = function(name){ ...
- 关于hadoop2.4.2版本学习时遇到的问题
问题一:namenode启动失败 描述:在初始化后hadoop后,发现datanode启动失败,namenode则可以正常启动,如果把用户换成root权限,再次启动时,则namenode和datano ...
- NULL, NUL, EOF, '\0',0区别
NULL: 定义为0或0L或(void *)0,用于指示一个指针值是空,即什么都不指:'\0': 用且只用字符串结束符;NUL : 0x00,0值字符,可以用于结束ASCII字符串,和'\0'类似,但 ...
- 在ubuntu下给eclipse创建桌面快捷方式
在桌面进行编辑 编辑eclipse.desktop [Desktop Entry] Encoding=UTF-8 Name=Eclipse Platform Comment=Eclipse IDE E ...
- Sybase ASE安装过程报错,无法创建数据库设备[AM fork() failed]
今天同事要搭建一套测试环境,安装开发版的SYBASE ASE 15.03 Windows平台下的,发现安装过程中到了创建数据库设备的环节就开始报错了,报错信息如下: 03/24/14 09:31:44 ...
- codeblocks常用快捷键
CodeBlocks常用操作快捷键编辑部分:Ctrl + A:全选Ctrl + C:复制Ctrl + X: 剪切Ctrl + V:粘贴Ctrl + Z:撤销Ctrl + S:保存Ctrl + Y / ...
- Android中9patch图片格式(xx.9.png)介绍与制作详解
一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...
- Weblogic12c安装与配置详解
Weblogic是什么Weblogic的安装Weblogic创建域Weblogic管理域Weblogic的应用Weblogic是什么 Weblogic这是我入职以后第一次接触到的词汇,我很陌生,就从我 ...
- IE9下Coolite.Ext出现createContextualFragment错误
解决Ext在IE9上报错“createContextualFragment”,只需要在使用Coolite.Ext页面加入如下代码即可: if ((typeof Range !== "unde ...