【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 ...
随机推荐
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- aix 上搭建node.js 环境
下载nodejs:ibm-4.4.3.0-node-v4.4.3-aix-ppc64.bin IBM已经适配最新版本的node.js :https://developer.ibm.com/node/ ...
- 简单的异步任务工具——rq 的使用教程
rq是一个简单的,轻量级的异步任务工具. 如果在网站中用户发起一个用时很久(大于2分钟)的请求,如果用同步的方式,服务器就会返回超时. 这时候就需要用异步请求,用户发起请求后,服务端把作业扔给另一个进 ...
- Intel Edison的那些事:修改Edison的HTTP服务的页面
Intel Edison配置好之后,按住PWR键2-7秒(4秒恰到好处),就可以进入AP热点模式(此时,Arduino扩展板上的灯不停闪烁),可以将笔记本接入Edison的热点,然后在浏览器中访问“h ...
- jquery.prompt.js 弹窗的使用
/*** * Prompt提示语插件 * 编写时间:2013年4月8号 * version:Prompt.1.0.js * author:小宇<i@windyland.com> ***/ ...
- SecureCRT上传bash: rz: command not found(转载)
转载自:http://blog.csdn.net/zhangdaiscott/article/details/18141017 -bash: rz: command not found rz命令没找到 ...
- 【BZOJ 2038】[2009国家集训队]小Z的袜子(hose)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- 微软职位内部推荐-Principal DEV Manager for Bing Client
微软近期Open的职位: Title: Principal DEV Manager for Bing ClientGroup: Search Technology Center Asia, BingW ...
- google calendar api v3
google api for .net nuget Install-Package Google.Apis.Calendar.v3 oauth2 for asp.net http://www.code ...
- sql shard/partition
sql http://www.infoq.com/news/2011/02/SQL-Sharding/ http://channel9.msdn.com/Shows/Data-Exposed/SqlD ...