Petrozavodsk Summer-2015. Ivan Smirnov Contest 1 B Bloom
http://opentrains.snarknews.info/~ejudge/team.cgi?contest_id=001463
题目大意:
给出$n$个$x$,$m$个$y$,问有多少个hash函数 $y \equiv Ax + B (mod \ p)$, $p$是质数使得对$x$的集合加密后得到$y$的集合。
题解:
首先将所有$x$ mod $p$后去重。 剩下$n$个不同的$x$,$m$个不同的$y$。
ps: 以下公式均在mod p域下,因此省略mod p。
如果$A = 0$,那么只可能$m = 1$, $B = y_0$
如果$A \neq 0$,因为p是质数,所以$A * x_i \neq A * x_j$. 那么必须$ n = m $
如果hash函数没有那个$B$,只有$y = Ax$怎么做呢?
考虑将每个数写成原根$g^i$的形式。
定义数组s, s[i] = 1 当且仅当 存在某个$x$,$x = g^i$.
定义数组t, t[i] = 1 当且仅当 存在某个$y$,$y = g^i$.
一个$A = g^k$合法当且仅当将s数组循环右移$k$位和t数组重合。
只要将t数组复制一遍做一次kmp就可以求出所有的$k$了。
再考虑如何把B给算进去.
假设$ y_i = A * x_i + B $. 两边对$i$求和。
记$sx = \sum\limits_{i=0}^{n - 1}x_i$, $sy = \sum\limits_{i=0}^{n - 1}y_i$
那么有$sy = A * sx + n * B$, $ B = \frac{sy - A * sx}{n}$ 是唯一的!
令$x_{i}^{'} = x_{i} - \frac{sx}{n}$ $y_{i}^{'} = y_{i} - \frac{sy}{n}$
问题就转化为$y_{i}^{'} = A * x_{i}^{'}$ 这两个问题是完全等价的.
另外还有一些小细节:比如n = p的时候,分母n是没有逆元的,所以要特判断。
还有如果存在某个$x_{i}^{'} = 0$, 不存在某个$y_{i}^{'} = 0$ 或者反过来,都是无解的。(0不能表示为$g^i$, 所以也要特判)。
代码:
#include <bits/stdc++.h>
using namespace std; #define MP make_pair
#define MAXN 1000010
int mod;
vector<int> xi, yi;
vector<pair<int, int> > ans; inline int add(int x, int y){return (x + y) % mod;}
inline int sub(int x, int y){return (x - y + mod) % mod;}
inline int mul(int x, int y){return 1ll * x * y % mod;} int power(int x, int p)
{
int res = ;
for (; p; p >>= )
{
if (p & ) res = mul(res, x);
x = mul(x, x);
}
return res;
} int inv(int x)
{
return power(x, mod - );
} int find_proot(int p)
{
static int pr[MAXN];
static int flag[MAXN];
for (int i = ; i < MAXN; ++i)
{
if (!flag[i]) pr[++pr[]] = i;
for (int j = ; j <= pr[] && i * pr[j] < MAXN; ++j)
{
flag[i * pr[j]] = ;
if (i % pr[j] == ) break;
}
} int g = ;
while (true)
{
int fl = , pp = p - ;
for (int i = ; i <= pr[] && pr[i] <= p; ++i)
{
if (pp % pr[i] == && power(g, pp / pr[i]) == )
{
fl = ;
break;
}
}
if (fl) return g; ++g;
}
return -;
} vector<int> calc_shift(int *s, int *t, int len)
{
static int nxt[MAXN];
nxt[] = nxt[] = ;
int j;
for (int i = ; i <= len; ++i)
{
j = nxt[i - ];
while (j && s[j] != s[i - ])
j = nxt[j];
nxt[i] = s[i - ] == s[j]? j + : ;
} for (int i = ; i < len; ++i)
t[len + i] = t[i]; j = ;
vector<int> res;
for (int i = ; i < * len - ; ++i)
{
while (j && t[i] != s[j])
j = nxt[j];
if (t[i] == s[j]) ++j;
if (j == len)
{
j = nxt[j];
res.push_back(i - len + );
}
}
return res;
} void solve(int n, int m, int p)
{
if (n < m) return;
if (m == ) ans.push_back(MP(, yi[]));
if (n != m) return;
if (n == p)
{
for (int a = ; a < p; ++a)
{
for (int b = ; b < p; ++b)
ans.push_back(MP(a, b));
}
return;
} int _n = inv(n);
int sx = , dx;
int sy = , dy; for (auto x: xi) sx = add(sx, x);
for (auto y: yi) sy = add(sy, y);
dx = mul(sx, _n);
dy = mul(sy, _n); int g = find_proot(p);
static int lg[MAXN];
memset(lg, -, sizeof(lg));
for (int i = ; i < p - ; ++i)
lg[power(g, i)] = i;
for (int i = ; i <= p - ; ++i)
assert(lg[i] != -); static int s[MAXN];
static int t[MAXN * ]; int x_zero = , y_zero = ;
for (auto x: xi)
{
if (x == dx) ++x_zero;
else s[lg[sub(x, dx)]] = ;
}
for (auto y: yi)
{
if (y == dy) ++y_zero;
else t[lg[sub(y, dy)]] = ;
}
if (x_zero != y_zero) return; vector<int> a_list = calc_shift(s, t, p - );
for (auto a: a_list)
{
a = power(g, a);
int b = mul(sub(sy, mul(a, sx)), _n);
ans.push_back(MP(a, b));
}
} int main()
{
//freopen("in.txt", "r", stdin);
int n, m, p, x, y;
scanf("%d %d %d", &n, &m, &p), mod = p;
for (int i = ; i < n; ++i)
{
scanf("%d", &x);
xi.push_back(x % p);
}
for (int i = ; i < m; ++i)
{
scanf("%d", &y);
yi.push_back(y);
}
sort(xi.begin(), xi.end());
xi.erase(unique(xi.begin(), xi.end()), xi.end()); sort(yi.begin(), yi.end());
yi.erase(unique(yi.begin(), yi.end()), yi.end()); n = xi.size();
m = yi.size(); solve(n, m, p); printf("%d\n", ans.size());
for (auto vv: ans) printf("%d %d\n", vv.first, vv.second); return ;
}
Petrozavodsk Summer-2015. Ivan Smirnov Contest 1 B Bloom的更多相关文章
- Root(hdu5777+扩展欧几里得+原根)2015 Multi-University Training Contest 7
Root Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- ACM-ICPC 2015 Shenyang Preliminary Contest B. Best Solver
The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart. ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 ...
- 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple
CRB and Apple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
随机推荐
- gitlab多人协同工作 ——转
http://www.360doc.com/content/14/0508/17/14416931_375851686.shtml
- {...formItemLayout} 标签布局
{...formItemLayout}是reactjs中属性的写法{...props},formItemLayout标签布局,wrapperCol需要为输入控件设置布局样式时,和label 标签布局, ...
- 原来这是一个经典面试题-------Day61
前几天在table的操作中,记录了动态生成表格的三种方式: 1.html语言的拼接:用字符串或者数组拼接在html语言中,这个理解起来最直观 2.插入行和列:insertRow()和insertCel ...
- linux svn恢复删除的文件夹和文件(转)
我觉得在window下面,查找被删除的svn文件夹和文件是件比较麻烦的事,恢复就更麻烦了.有的时候,命令还是比鼠标要好用的. 下面做一个例子来说明一下,删除和恢复的例子. [root@BlackGho ...
- Nutch的发展历程(转)
2002年8月由Doug Cutting发起,托管于Sourceforge,之后发布了0.4.0.5.0.6三个版本 2004年9月Oregon State University(俄勒冈州立大学)采用 ...
- 【Shiro】Apache Shiro架构之身份认证(Authentication)
Shiro系列文章: [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shiro ...
- Netty4具体解释三:Netty架构设计
读完这一章,我们基本上能够了解到Netty全部重要的组件,对Netty有一个全面的认识.这对下一步深入学习Netty是十分重要的,而学完这一章.我们事实上已经能够用Netty解决一些常规的问 ...
- js操作注意事项
1.函数赋值给变量时,不能加括号 function fun() { ... } var str=fun; 2.js创建构造函数和调用对象,对象内不能用var 变量,只能用this function f ...
- JSP应用开发 -------- 电纸书(未完待续)
http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术 第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...
- vivado error [Labtools 27-2149]
使用vivado2014.3时遇到了这种错误 ERROR: [Labtools 27-2149] File E:/project/V7_PCIE/prj/PhasedProject/M_PcieGen ...