@description@

令 p[] 为质数序列:p[0] = 2, p[1] = 3, p[2] = 5,以此类推。

令 D 为正整数常数。对于每一个 i >= 0,令 q[i] = q[i] * q[i + D]。

考虑等式 V + W + X + Y = Z。

现给定 N 与 D。统计上面等式的解的数量,同时要求 V <= W <= X <= Y 且所有量 V, W, X, Y, Z 都属于集合 Q = {q[0], q[1], ..., q[N-1]}。

Constraints

1 <= N <= 2500,0 <= D <= 2500。

Examples

0)

15

1

Returns: 2

两个解如下:

6 + 15 + 323 + 323 = 667

6 + 143 + 221 + 1147 = 1517

2470

0

Returns: 0

不存在任何解。

@solution@

假如等式是这样的:W + X + Y = Z。

我们可以变为 W + X = Z - Y,然后 meet in the middle 即可。

那么 5 个变量怎么办呢?注意还有一个条件:p 是质数。

质数有一个什么性质呢?比较复杂的性质当然不是我们分析的目标。我们只考虑质数的奇偶性。

奇偶分析一波,可以发现 5 个变量不可能同时为奇数。然而质数中只有 2 为偶数,所以相当于一定存在一个 2。

而又因为 2 是最小的那个质数,所以得到 V = 2*p[D]。

然后就可以愉快地 meet in the middle 了。

@accepted code@

#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
class Diophantine{
#define MAXN 2500
#define PRIME 60000
#define HASHSIZE 1000037
typedef long long ll;
typedef pair<ll, int> pii;
#define fi first
#define se second
private:
int prm[PRIME + 5], nprm[PRIME + 5], pcnt;
void sieve() {
for(int i=2;i<=PRIME;i++) {
if( !nprm[i] ) prm[pcnt++] = i;
for(int j=0;i*prm[j]<=PRIME;j++) {
nprm[i*prm[j]] = true;
if( i % prm[j] == 0 ) break;
}
}
}
vector<pii>hsh[HASHSIZE];
void hash_insert(ll x) {
int y = x % HASHSIZE;
for(int i=0;i<hsh[y].size();i++)
if( hsh[y][i].fi == x ) {
hsh[y][i].se++;
return ;
}
hsh[y].push_back(make_pair(x, 1));
}
int hash_search(ll x) {
int y = x % HASHSIZE;
for(int i=0;i<hsh[y].size();i++)
if( hsh[y][i].fi == x )
return hsh[y][i].se;
return 0;
}
public:
ll q[MAXN + 5];
int countSolutions(int N, int D) {
sieve();
for(int i=0;i<N;i++)
q[i] = prm[i] * prm[i + D];
int ans = 0;
for(int i=N-1;i>=0;i--) {
for(int j=i+1;j<N;j++)
if( q[j] - q[i] - q[0] > 0 )
hash_insert(q[j] - q[i] - q[0]);
for(int j=i;j>=0;j--)
ans += hash_search(q[i] + q[j]);
}
return ans;
}
};

@details@

一开始看错题了,还以为只有 4 个变量,然后就以为是 meet in the middle 的题。

结果发现是 5 个变量,然后修正一下想法就过了。

这算是。。。因祸得福吗。。。

@topcoder - TCO19 Regional Wildcard Wildcard Round - D1L2@ Diophantine的更多相关文章

  1. Makefile关键字

    @ makefile会把将要执行的命令行在命令执行前输出到屏幕上,使用@可以避免显示出命令本身 若@ echo 正在编译-则$make显示正在编译- 若echo 正在编译-则$make显示: echo ...

  2. beego路由实现原理

    树形结构+递归算法实现路由的注册与匹配: 1 数据结构: // 树节点结构type Tree struct { //search fix route first fixrouters map[stri ...

  3. (转)How to build an Apple Push Notification provider server (tutorial)

    转自:https://blog.serverdensity.com/how-to-build-an-apple-push-notification-provider-server-tutorial/ ...

  4. Linux 通过HTTP进行域名更新

    一.3322动态域名更新接口 接口地址 API URL http://members.3322.net/dyndns/update HTTP请求 GET /dyndns/update?hostname ...

  5. [Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等

    1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...

  6. 转-Windows路由表配置:双网卡路由分流

    原文链接:http://www.cnblogs.com/lightnear/archive/2013/02/03/2890835.html 一.windows 路由表解释 route print -4 ...

  7. Docker+Jenkins持续集成环境(5): android构建与apk发布

    项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...

  8. [Python] wxPython 高防Windows10记事本 (end...)

    1.开始 接触Python 也有一段时间了,o.o ,断断续续加起来没几天. 一般新学习一门新语言,除了必先输出一个 Hello World 外,都会以模拟 Windows 记事本来写一个结合自己想法 ...

  9. Linux 下 make 命令 及 make 笔记

    Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make ...

随机推荐

  1. @ font-face 引入本地字体文件

    @font-face { font-family: DeliciousRoman; src: url('…/Delicious-Roman.otf'); font-stretch: condensed ...

  2. REM布局计算,移动端,pc端有兼容性)

    rem布局计算(移动端,pc端有兼容性) <!DOCTYPE html> <html> <head lang="en"> <script& ...

  3. pc端样式重置以及常用样式规范class

    //reset html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a ...

  4. 【笔记】LR集合点

    集合点的引入是为了模拟并发场景: 1.模拟多用户相同操作的并发. 2.模拟多用户不同操作的并发.(把集合点的名字改成一个就可以了) 在脚本中插入集合点 集合点只需要在脚本中插入rendezvous即可 ...

  5. 常见的HTML标签的嵌套规则

    众所周知,HTML标签有两类: 块级元素div.h1~h6.address.blockquote.center.dir.dl.dt.dd.fieldset.form.hr.isindex.menu.n ...

  6. MySQL数据库的全局锁和表锁

    1.概念 数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.而锁就是用来实现这些访问规则的重要数据结构. 2.锁的分类 根据加锁的范围, ...

  7. PyCharm常用技巧集合

    PyCharm常用技巧集合 一.添加或者修改文件模板 File>settings>Editor>File and Code Templates>Python Script 你可 ...

  8. 集训队日常训练20180513-DIV2

    A.2176 给一个字符串s,问距离为D的字母对是否存在相同. 模拟. #include<bits/stdc++.h> using namespace std; int main() { ...

  9. 【洛谷P2722 USACO】 总分 01背包模板

    P2722 总分 Score Inflation 题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个 ...

  10. 【CODEVS】倒水问题

    题目描述: 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知 ...