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的更多相关文章

  1. 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 ...

  2. 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)

    官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...

  3. 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 ...

  4. 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. ...

  5. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  6. 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 ...

  7. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. vue - utils for extract-text-webpack-plugin

    描述:将包或包中的文本提取到单独的文件中, 点击查看官网详情: https://www.npmjs.com/package/extract-text-webpack-plugin

  2. 初识 Swift编程语言(中文版)

    前言 今天Apple公布了新的编程语言Swift.也提供了一本将近400页的 The Swift Programming Language(Swift编程语言). 尽管我没有开发人员账号.没法实际上机 ...

  3. sql server 数据加密

    select EncryptByPassPhrase('hksjlm',qlrmc)jmsj,* into jmqlr from qlr where qlbh in('5201411120005',' ...

  4. ASP.NET MVC 简单的分页思想与实现

    首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名为JohnConnor.Web 对创建过程或Razor不太了解的看官,请移步 ASP.NET MVC ...

  5. II7.5配置IIS支持2G文件下载

    IIS默认支持下载在20M让IIS7.5支持大文件下载,有两个地方 1.打IIS管理器->asp->点限制属性+->设置最大请求实体主体限制为2147483648 2.打开路径C:\ ...

  6. django学习笔记【001】django版本的确定&创建一个django工程

    2.3 查看当前的django版本 python3. -m django --version 2.3.1 创建一个django工程 django-admin startproject mysite 在 ...

  7. Atitit.有分区情况下的表查询策略流程

    Atitit.有分区情况下的表查询策略流程 1. 分区表查询策略流程1 2. 常见数据库oracle mysql的分区查询语句1 2.1. 跨分区查询(oracle)1 2.2. 单分区查询 (ora ...

  8. 聊一聊Android的消息机制

    聊一聊Android的消息机制 侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前者用于跨进程通信,后者用于进程内部通信. 从技术实现上来说,消息机制还是比 ...

  9. InnoDB:文件

    Mysql中有多种类型的文件,每种类型的文件都有其特定的作用,下面就来说说: 参数文件:告诉Mysql实例数据库文件的位置,定义参数. 日志文件:Mysql实例对某种条件作出的响应写入文件,这个文件就 ...

  10. HDU 1978 How many ways DP问题

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...